2017-11-15 2 views
1

Ich habe derzeit eine TXT-Datei, die ich lesen und ausgeben muss, basierend auf dem, was drin ist. Ich habe derzeit die Datei zum Öffnen und Speichern jeder Zeile in der Datei in eine ArrayList.Sortierung einer ArrayList nach dem zweiten Wort in einer Zeichenkette

Die TXT-Datei ist wie folgt eingerichtet:

  • 2380213012999 1508434343432 david tot
  • 4327482397488 7439857934858 john lebendig
  • 3857948998099 2222783749887 martin getötet Kelly
  • 3857948998099 2222783749887 john getötet david

Aktueller Code;

{ 
    try { 
     File file = new File("input.txt"); 
     FileReader fileReader = new FileReader(file); 
     BufferedReader bufferedReader = new BufferedReader(fileReader); 
     StringBuffer stringBuffer = new StringBuffer(); 
     String line; 
     ArrayList<String> txtline = new ArrayList<String>(); 
     while ((line = bufferedReader.readLine()) != null) { 
      txtline.add(line); 
      System.out.println(txtline); 
     } 

     fileReader.close(); 
     System.out.println(stringBuffer.toString()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

} 

Ich frage mich nur, ob es einen Weg gibt, jede Textzeile von der zweiten großen Zahl zu sortieren, ich habe geschaut und ich kann einfach nicht, etwas zu finden scheinen. Ein Punkt in die richtige Richtung oder eine Anleitung wäre erstaunlich, da ich momentan ratlos bin, da ich dies tun muss, bevor ich weiterkomme.

+0

Eine im Allgemeinen eine 'Comparator' Implementierung für das Sortieren von Objekten in andere als ihre natürlichen Ordnung zu schaffen, definiert (einschließlich, wenn sie keine natürlichen haben Auftrag). Sie können eine Instanz eines solchen 'Comparators' zusammen mit' Collections.sort() 'verwenden, um Ihre' List' zu sortieren. –

+1

Aber aus Effizienz würde ich vorschlagen, die Sortierschlüssel im Voraus zu analysieren und sie neben den entsprechenden Strings in Objekten einer Klasse zu speichern, die Sie für diesen Zweck definieren. Dann sortiere * diese *. –

Antwort

1

Sie können die Aufgabe erreichen, indem ein Strom von der Liste erstellen, in einem Comparator Objekt dem die Sortierschlüssel definieren sorted Methode übergeben und dann in eine ArrayList zu sammeln.

Vergleich numerisch:

txtline = txtline.stream() 
       .sorted(Comparator.comparingLong((String e) -> Long.parseLong(e.split(" ")[1])))        
       .collect(Collectors.toCollection(ArrayList::new)); 

von Streichern Vergleich:

txtline = txtline.stream() 
       .sorted(Comparator.comparing((String e) -> e.split(" ")[1])) 
       .collect(Collectors.toCollection(ArrayList::new)); 
+0

Das funktioniert super danke! - so spaltet dies jedes der Objekte in der Arraylist auf und teilt jedes durch Leerzeichen in ein Array auf und sortiert dann das zweite Objekt in das Array? bin ich richtig beim denken, es ist nur ich will es vollständig verstehen! Danke übrigens! – JorD

+0

@JorD yup so im Grunde _extract_ die zweite Zahl jeder Zeile, indem Sie es mit dem Trennzeichen "" "trennen und nehmen Sie das zweite Element und das ist dann sortiert nach dem extrahierten Schlüssel. Du kannst auch Danke sagen, indem du die Antwort akzeptierst ;-) –

1

Setzen Sie diese nach der while-Schleife

java.util.Collections.sort(txtLine, new Comparator<String>() { 
    public void compare(String lineA, String lineB) { 
     String wordA2 = lineA.split(" ")[1]; 
     String wordB2 = lineB.split(" ")[1]; 
     return wordA2.compareTo(wordB2); 
    } 
}); 

effizienter durchgeführt werden kann, aber der Code ist nicht viel kürzer als diese (es sei denn, Sie lambdas verwenden).

java.util.Collections.sort(txtLine, (String lineA, String lineB) -> { 
     String wordA2 = lineA.split(" ")[1]; 
     String wordB2 = lineB.split(" ")[1]; 
     return wordA2.compareTo(wordB2); 
}); 
+0

'txtLine.sort (Comparator.comsparing (line -> line.split (" ") [1]));' – shmosel

+0

Btw dies funktioniert nicht, wenn es numerisch sortiert werden soll. – shmosel

+0

@smosel Sie haben Recht ... aber wenn man sich das Format der Daten in der Frage ansieht, scheint das kein Problem zu sein. –

Verwandte Themen