2016-12-26 5 views
1

を並べ替え:私は、このCSVファイルを持っCSVRecordsのリスト(Apacheのコモンズ)

@Override 
    public void sort(InputStream in, OutputStream out, String field_name, Comparator<CSVRecord> comparator) throws IOException { 

    Reader inputStreamReader = new InputStreamReader(in); 
    Iterable<CSVRecord> csvRecords = CSVFormat.RFC4180.withFirstRecordAsHeader().parse(inputStreamReader); 

    List<CSVRecord> csvRecordsList = Lists.newArrayList(csvRecords); 
    Collections.sort(csvRecordsList,comparator); 

    Writer outputStreamWriter = new OutputStreamWriter(out); 
    CSVPrinter cvsPrinter = CSVFormat.RFC4180.print(outputStreamWriter); 
    cvsPrinter.printRecords(csvRecordsList); 
    cvsPrinter.flush(); 
    cvsPrinter.close(); 

問題があることである:私は次のメソッドを使用して昇順に注文したい

User ID,First Name 
3,David 
4,Ruby 
10,Ruby 

Collections.sortは何もしません。これは私がパラメータとして提供するものです:

Comparator<CSVRecord> comparator = (op1,op2) -> op2.get(field).compareTo(op1.get(field)); 

どうしたらいいですか?

+0

私は、コード実行した場合、私は出力としてこれを得た: 4を、 "ルビー" 3、 "デビッド" 10、 "ルビー" – user3727540

+0

どのように 'field'が定義されていますか? – oschlueter

+0

このように:final String field = "User ID"; – user3727540

答えて

1

CSVRecord.get()は、Stringを返します。実際には、コンパレータでInteger.compareToの代わりにString.compareToを呼び出しています。代わりにこれを試してみてください:

Comparator<CSVRecord> comparator = (op1,op2) -> Integer.valueOf(op2.get(field)).compareTo(Integer.valueOf(op1.get(field))); 
+0

それは動作します!ありがとう! String.compareToを使用するのがなぜ問題だったのか教えていただけますか?それは0-9の数字のためにうまくいきました。 – user3727540

+0

また、元のCSVヘッダーを出力でも書き込むにはどうすればよいですか? – user3727540

+0

'String.compareTo'はあなたの文字列中の数字を数字ではなく個々の数字として解釈します。同じインデックスの2つの配列を要素ごとに比較すると考えてください。したがって、 "6"が "10"と比較されると、位置0の文字が比較され、 '1'は '6'より小さいので、そのままの順序が与えられます。 – oschlueter

関連する問題