import java.util.* ;
import java.io.* ;
class Data{
int maxCodeLength;
int maxNameLength;
int maxPriceLength;
int zenkaku;
int hankaku;
final String undefStr
= "未設定" ; int undefStrLen;
this .code = code;
this .name = name;
this .price = price;
this .undefStrLen = method2( undefStr) ;
}
public int codeLength( ) {
return price == null ? undefStrLen : method2( code) ;
}
public int nameLength( ) {
return name == null ? undefStrLen : method2( name) ;
}
public int priceLength( ) {
return price == null ? undefStrLen : price.toString ( ) .length ( ) ;
}
String spaceCode
= code
== null ? getSpace
( maxCodeLength, method2
( undefStr
) ) : getSpace
( maxCodeLength, method2
( code
) ) ; String spaceName
= name
== null ? getSpace
( maxNameLength, method2
( undefStr
) ) : getSpace
( maxNameLength, method2
( name
) ) ; return code+ spaceCode+ " " + name+ spaceName+ " " + getStrInt( price, maxPriceLength) ;
}
final String fmt
= "%" + max
+ "d" ; return price
== null ? getSpace
( undefStrLen, max
) + undefStr
: String .
format ( fmt, price
) ; }
private String getSpace
( int max,
int len
) { for ( int i= 0 ; i< max- len; i++ ) {
space += " " ;
}
return space;
}
public void setMaxCodeLength( int value) {
maxCodeLength = value;
}
public void setMaxNameLength( int value) {
maxNameLength = value;
}
public void setMaxPriceLength( int value) {
maxPriceLength = value;
}
public int method2
( String s
) { //コマンドライン上での文字列の見映えの長さ。コマンドライン上で見えている文字列の長さ。見えている長さ。見た時の長さ。 // Javaで全角・半角の判定 - のらくら備忘録
// http://k...content-available-to-author-only...2.com/blog-entry-111.html
int length = 0 ;
zenkaku = 0 ;
hankaku = 0 ;
char [ ] chars = s.toCharArray ( ) ;
for ( int i = 0 ; i < chars.length ; i++ ) {
char c = chars[ i] ;
if ( ( c <= '\u 007e' ) || // 英数字
( c == '\u 00a5' ) || // \記号
( c == '\u 203e' ) || // ~記号
( c >= '\u ff61' && c <= '\u ff9f' ) // 半角カナ
) {
//System.out.print("半");
hankaku++;
} else {
//System.out.print("全");
zenkaku++;
}
}
return hankaku + zenkaku* 2 ;
}
}
class CsvOrm{
public static void main
( String [ ] args
) { ArrayList< Data> data = new ArrayList<> ( ) ;
try {
while ( ( line = br.readLine ( ) ) != null ) {
//System.out.println("check:"+line);//check, ok
//ArrayList<String> temp = line.split(",");
String [ ] temp
= line.
split ( "," ) ; //System.out.println("len:"+temp.length);//check, ok
final Integer price
= temp.
length == 2 ? null : Integer .
parseInt ( temp
[ 2 ] ) ; //末尾のpriceが欠損してる場合。 data.add ( new Data( func( temp[ 0 ] ) , func( temp[ 1 ] ) , price) ) ;
}
System .
out .
println ( e.
getMessage ( ) ) ; } finally {
try {
br.close ( ) ;
System .
out .
println ( e.
getMessage ( ) ) ; }
}
adjust( data) ;
show( data) ;
}
public static void adjust( ArrayList< Data> data) {
final Comparator
< Data
> cmpCodeLen
= ( s1, s2
) -> Integer .
compare ( s1.
codeLength ( ) , s2.
codeLength ( ) ) ; final Comparator
< Data
> cmpNameLen
= ( s1, s2
) -> Integer .
compare ( s1.
nameLength ( ) , s2.
nameLength ( ) ) ; final Comparator
< Data
> cmpPriceLen
= ( s1, s2
) -> Integer .
compare ( s1.
priceLength ( ) , s2.
priceLength ( ) ) ;
Optional< Data> maxCodeData = data.stream ( ) .max ( cmpCodeLen) ;
Optional< Data> maxNameData = data.stream ( ) .max ( cmpNameLen) ;
Optional< Data> maxPriceData = data.stream ( ) .max ( cmpPriceLen) ;
final int maxCodeLength = maxCodeData.get ( ) .codeLength ( ) ;
final int maxNameLength = maxNameData.get ( ) .nameLength ( ) ;
final int maxPriceLength = maxCodeData.get ( ) .priceLength ( ) ;
System .
out .
println ( "maxCodeLength :" + maxCodeLength
) ; System .
out .
println ( "maxNameLength :" + maxNameLength
) ; System .
out .
println ( "maxPriceLength:" + maxPriceLength
) ;
for ( Data d: data) {
d.setMaxCodeLength ( maxCodeLength) ;
d.setMaxNameLength ( maxNameLength) ;
d.setMaxPriceLength ( maxPriceLength) ;
}
}
public static void show( ArrayList< Data> data) {
for ( Data d: data) {
}
}
if ( data.isEmpty ( ) ) {
return "未設定" ;
}
if ( data == null ) {
return "null" ;
}
return data;
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5pby4qOwoKCmNsYXNzIERhdGF7CglTdHJpbmcgY29kZTsKCVN0cmluZyBuYW1lOwoJSW50ZWdlciBwcmljZTsKCQoJaW50IG1heENvZGVMZW5ndGg7CglpbnQgbWF4TmFtZUxlbmd0aDsKCWludCBtYXhQcmljZUxlbmd0aDsKCQoJaW50IHplbmtha3U7CglpbnQgaGFua2FrdTsKCQoJZmluYWwgU3RyaW5nIHVuZGVmU3RyID0gIuacquioreWumiI7CglpbnQgdW5kZWZTdHJMZW47CgkKCURhdGEoU3RyaW5nIGNvZGUsIFN0cmluZyBuYW1lLCBJbnRlZ2VyIHByaWNlKXsKCQl0aGlzLmNvZGUgPSBjb2RlOwoJCXRoaXMubmFtZSA9IG5hbWU7CgkJdGhpcy5wcmljZSA9IHByaWNlOwoJCQoJCXRoaXMudW5kZWZTdHJMZW4gPSBtZXRob2QyKHVuZGVmU3RyKTsKCX0KCXB1YmxpYyBpbnQgY29kZUxlbmd0aCgpewoJCXJldHVybiBwcmljZSA9PSBudWxsID8gdW5kZWZTdHJMZW4gOiBtZXRob2QyKGNvZGUpOwoJfQoJcHVibGljIGludCBuYW1lTGVuZ3RoKCl7CgkJcmV0dXJuIG5hbWUgPT0gbnVsbCA/IHVuZGVmU3RyTGVuIDogbWV0aG9kMihuYW1lKTsKCX0KCXB1YmxpYyBpbnQgcHJpY2VMZW5ndGgoKXsKCQlyZXR1cm4gcHJpY2UgPT0gbnVsbCA/IHVuZGVmU3RyTGVuIDogcHJpY2UudG9TdHJpbmcoKS5sZW5ndGgoKTsKCX0KCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKCQlTdHJpbmcgc3BhY2VDb2RlID0gY29kZSA9PSBudWxsID8gZ2V0U3BhY2UobWF4Q29kZUxlbmd0aCwgbWV0aG9kMih1bmRlZlN0cikpIDogZ2V0U3BhY2UobWF4Q29kZUxlbmd0aCwgbWV0aG9kMihjb2RlKSk7CgkJU3RyaW5nIHNwYWNlTmFtZSA9IG5hbWUgPT0gbnVsbCA/IGdldFNwYWNlKG1heE5hbWVMZW5ndGgsIG1ldGhvZDIodW5kZWZTdHIpKSA6IGdldFNwYWNlKG1heE5hbWVMZW5ndGgsIG1ldGhvZDIobmFtZSkpOwoJCXJldHVybiBjb2RlK3NwYWNlQ29kZSsiICIrbmFtZStzcGFjZU5hbWUrIiAiK2dldFN0ckludChwcmljZSwgbWF4UHJpY2VMZW5ndGgpOwoJfQoJcHJpdmF0ZSBTdHJpbmcgZ2V0U3RySW50KEludGVnZXIgdmFsdWUsIGludCBtYXgpewoJCWZpbmFsIFN0cmluZyBmbXQgPSAiJSIrbWF4KyJkIjsKCQlyZXR1cm4gcHJpY2UgPT0gbnVsbCA/IGdldFNwYWNlKHVuZGVmU3RyTGVuLCBtYXgpK3VuZGVmU3RyIDogU3RyaW5nLmZvcm1hdChmbXQsIHByaWNlKTsKCX0KCXByaXZhdGUgU3RyaW5nIGdldFNwYWNlKGludCBtYXgsIGludCBsZW4pewoJCVN0cmluZyBzcGFjZSA9ICIiOwoJCWZvcihpbnQgaT0wOyBpPG1heC1sZW47IGkrKyl7CgkJCXNwYWNlICs9ICIgIjsKCQl9CgkJcmV0dXJuIHNwYWNlOwoJfQoJcHVibGljIHZvaWQgc2V0TWF4Q29kZUxlbmd0aChpbnQgdmFsdWUpewoJCW1heENvZGVMZW5ndGggPSB2YWx1ZTsKCX0KCXB1YmxpYyB2b2lkIHNldE1heE5hbWVMZW5ndGgoaW50IHZhbHVlKXsKCQltYXhOYW1lTGVuZ3RoID0gdmFsdWU7Cgl9CglwdWJsaWMgdm9pZCBzZXRNYXhQcmljZUxlbmd0aChpbnQgdmFsdWUpewoJCW1heFByaWNlTGVuZ3RoID0gdmFsdWU7Cgl9CglwdWJsaWMgaW50IG1ldGhvZDIoU3RyaW5nIHMpIHsvL+OCs+ODnuODs+ODieODqeOCpOODs+S4iuOBp+OBruaWh+Wtl+WIl+OBruimi+aYoOOBiOOBrumVt+OBleOAguOCs+ODnuODs+ODieODqeOCpOODs+S4iuOBp+imi+OBiOOBpuOBhOOCi+aWh+Wtl+WIl+OBrumVt+OBleOAguimi+OBiOOBpuOBhOOCi+mVt+OBleOAguimi+OBn+aZguOBrumVt+OBleOAggoJCS8vIEphdmHjgaflhajop5Ljg7vljYrop5Ljga7liKTlrpogLSDjga7jgonjgY/jgonlgpnlv5jpjLIKCQkvLyBodHRwOi8vay4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uMi5jb20vYmxvZy1lbnRyeS0xMTEuaHRtbAoJCQoJCWludCBsZW5ndGggPSAwOwoJCXplbmtha3UgPSAwOwoJCWhhbmtha3UgPSAwOwoJCQoJCWNoYXJbXSBjaGFycyA9IHMudG9DaGFyQXJyYXkoKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7CgkJCWNoYXIgYyA9IGNoYXJzW2ldOwoJCQlpZiAoKGMgPD0gJ1x1MDA3ZScpIHx8IC8vIOiLseaVsOWtlwoJCQkJCShjID09ICdcdTAwYTUnKSB8fCAvLyBc6KiY5Y+3CgkJCQkJKGMgPT0gJ1x1MjAzZScpIHx8IC8vIH7oqJjlj7cKCQkJCQkoYyA+PSAnXHVmZjYxJyAmJiBjIDw9ICdcdWZmOWYnKSAvLyDljYrop5Ljgqvjg4oKCQkJKSB7CgkJCQkvL1N5c3RlbS5vdXQucHJpbnQoIuWNiiIpOwoJCQkJaGFua2FrdSsrOwoJCQl9IGVsc2UgewoJCQkJLy9TeXN0ZW0ub3V0LnByaW50KCLlhagiKTsKCQkJCXplbmtha3UrKzsKCQkJfQoJCX0KCQlyZXR1cm4gaGFua2FrdSArIHplbmtha3UqMjsKCX0KfQpjbGFzcyBDc3ZPcm17CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKXsKCQlTdHJpbmcgZmlsZU5hbWUgPSAi5ZWG5ZOB5LiA6KanLmNzdiI7CgkJQnVmZmVyZWRSZWFkZXIgYnIgPSBudWxsOwoJCUFycmF5TGlzdDxEYXRhPiBkYXRhID0gbmV3IEFycmF5TGlzdDw+KCk7CgkJCgkJdHJ5ewoJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7CgkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpLCAiVVRGLTgiKSk7CgkJCVN0cmluZyBsaW5lOwoJCQl3aGlsZSgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpewoJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImNoZWNrOiIrbGluZSk7Ly9jaGVjaywgb2sKCQkJCS8vQXJyYXlMaXN0PFN0cmluZz4gdGVtcCA9IGxpbmUuc3BsaXQoIiwiKTsKCQkJCVN0cmluZ1tdIHRlbXAgPSBsaW5lLnNwbGl0KCIsIik7CgkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibGVuOiIrdGVtcC5sZW5ndGgpOy8vY2hlY2ssIG9rCgkJCQkKCQkJCWZpbmFsIEludGVnZXIgcHJpY2UgPSB0ZW1wLmxlbmd0aCA9PSAyID8gbnVsbCA6IEludGVnZXIucGFyc2VJbnQodGVtcFsyXSk7Ly/mnKvlsL7jga5wcmljZeOBjOasoOaQjeOBl+OBpuOCi+WgtOWQiOOAggoJCQkJZGF0YS5hZGQobmV3IERhdGEoZnVuYyh0ZW1wWzBdKSwgZnVuYyh0ZW1wWzFdKSwgcHJpY2UpKTsKCQkJfQoJCX1jYXRjaChFeGNlcHRpb24gZSl7CgkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7CgkJfWZpbmFsbHl7CgkJCXRyeXsKCQkJCWJyLmNsb3NlKCk7CgkJCX1jYXRjaCAoRXhjZXB0aW9uIGUpewoJCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKCQkJfQoJCX0KCQkKCQlhZGp1c3QoZGF0YSk7CgkJc2hvdyhkYXRhKTsKCX0KCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGp1c3QoQXJyYXlMaXN0PERhdGE+IGRhdGEpewoJCWZpbmFsIENvbXBhcmF0b3I8RGF0YT4gY21wQ29kZUxlbiA9IChzMSwgczIpIC0+IEludGVnZXIuY29tcGFyZShzMS5jb2RlTGVuZ3RoKCksIHMyLmNvZGVMZW5ndGgoKSk7CgkJZmluYWwgQ29tcGFyYXRvcjxEYXRhPiBjbXBOYW1lTGVuID0gKHMxLCBzMikgLT4gSW50ZWdlci5jb21wYXJlKHMxLm5hbWVMZW5ndGgoKSwgczIubmFtZUxlbmd0aCgpKTsKCQlmaW5hbCBDb21wYXJhdG9yPERhdGE+IGNtcFByaWNlTGVuID0gKHMxLCBzMikgLT4gSW50ZWdlci5jb21wYXJlKHMxLnByaWNlTGVuZ3RoKCksIHMyLnByaWNlTGVuZ3RoKCkpOwoJCQoJCU9wdGlvbmFsPERhdGE+IG1heENvZGVEYXRhID0gZGF0YS5zdHJlYW0oKS5tYXgoY21wQ29kZUxlbik7CgkJT3B0aW9uYWw8RGF0YT4gbWF4TmFtZURhdGEgPSBkYXRhLnN0cmVhbSgpLm1heChjbXBOYW1lTGVuKTsKCQlPcHRpb25hbDxEYXRhPiBtYXhQcmljZURhdGEgPSBkYXRhLnN0cmVhbSgpLm1heChjbXBQcmljZUxlbik7CgkJCgkJZmluYWwgaW50IG1heENvZGVMZW5ndGggPSBtYXhDb2RlRGF0YS5nZXQoKS5jb2RlTGVuZ3RoKCk7CgkJZmluYWwgaW50IG1heE5hbWVMZW5ndGggPSBtYXhOYW1lRGF0YS5nZXQoKS5uYW1lTGVuZ3RoKCk7CgkJZmluYWwgaW50IG1heFByaWNlTGVuZ3RoID0gbWF4Q29kZURhdGEuZ2V0KCkucHJpY2VMZW5ndGgoKTsKCQkKCQlTeXN0ZW0ub3V0LnByaW50bG4oIm1heENvZGVMZW5ndGggOiIrbWF4Q29kZUxlbmd0aCk7CgkJU3lzdGVtLm91dC5wcmludGxuKCJtYXhOYW1lTGVuZ3RoIDoiK21heE5hbWVMZW5ndGgpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigibWF4UHJpY2VMZW5ndGg6IittYXhQcmljZUxlbmd0aCk7CgkJCgkJZm9yKERhdGEgZDogZGF0YSl7CgkJCWQuc2V0TWF4Q29kZUxlbmd0aChtYXhDb2RlTGVuZ3RoKTsKCQkJZC5zZXRNYXhOYW1lTGVuZ3RoKG1heE5hbWVMZW5ndGgpOwoJCQlkLnNldE1heFByaWNlTGVuZ3RoKG1heFByaWNlTGVuZ3RoKTsKCQl9Cgl9CglwdWJsaWMgc3RhdGljIHZvaWQgc2hvdyhBcnJheUxpc3Q8RGF0YT4gZGF0YSl7CgkJZm9yKERhdGEgZDogZGF0YSl7CgkJCVN5c3RlbS5vdXQucHJpbnRsbihkKTsKCQl9Cgl9CglwdWJsaWMgc3RhdGljIFN0cmluZyBmdW5jKFN0cmluZyBkYXRhKXsKCQlpZihkYXRhLmlzRW1wdHkoKSl7CgkJCXJldHVybiAi5pyq6Kit5a6aIjsKCQl9CgkJaWYoZGF0YSA9PSBudWxsKXsKCQkJcmV0dXJuICJudWxsIjsKCQl9CgkJcmV0dXJuIGRhdGE7Cgl9Cn0K