2016-12-26 2 views
1

ich diese CSV-Datei bekam:Sortieren einer Liste von CSVRecords (Apache Commons)

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

die Ich mag würde aufsteigend bestellen Sie die folgende Methode verwenden:

@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(); 

Das Problem ist, dass Collections.sort tut nichts. Dies ist das vergleichbare, das ich als Parameter zur Verfügung stelle:

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

Was mache ich falsch?

+0

Ich habe dies als Ausgang, wenn ich diesen Code ausführen: 4, "Ruby" 3, "David" 10, "Ruby" – user3727540

+0

wie ist 'field' definiert? – oschlueter

+0

wie folgt: final String field = "User ID"; – user3727540

Antwort

1

CSVRecord.get() gibt String zurück, so dass Sie tatsächlich String.compareTo anstelle von Integer.compareTo in Ihrem Vergleicher aufrufen. Versuchen Sie stattdessen:

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

Es funktioniert! Vielen Dank! Können Sie mir bitte sagen, warum die Verwendung von String.compareTo ein Problem war? Es funktionierte gut für Ziffern von 0-9. – user3727540

+0

Wissen Sie außerdem, wie ich den ursprünglichen CSV-Header auch in der Ausgabe schreiben kann? – user3727540

+0

'String.compareTo' interpretiert die Zahlen in Ihren Strings nicht als Zahlen, sondern als einzelne Zahlen. Stellen Sie sich vor, Sie vergleichen zwei Arrays Element für Element für denselben Index. Wenn also "6" mit "10" verglichen wird, werden die Zeichen an Position 0 verglichen, und da "1" kleiner als "6" ist, wird die Reihenfolge so gegeben, wie sie ist. – oschlueter