2011-01-15 8 views
12

Wie sortiere ich am besten ArrayList<String[]> in Java?ArrayList von Array in Java sortieren

Wo String [] ist ...

String[] = new String[] { "abc", "abc", "abc", "abc", "abc", "abc", "abc" }; 

Jetzt möchte ich von der 2. Wert von String [] (bei Index 1) die gesamte Arraylist sortieren. Ich muss jeden String [] durchlaufen und dann sein Kind mit Index 1.

Irgendwelche Ideen?

EDITED


Ich habe mehr Beschreibung. Ich bekomme tatsächlich Schulen aus einer XML-Datei und jeder Knoten in XML hat 7 Attribute. Jetzt erstelle ich eine ArrayList von String [], die diese Schulknoten von XML hält und String [] Array selbst hält Attribute eines bestimmten Knotens.

Nun, die Art, wie ich es sortieren möchte, sollte nach dem Zustand der Schule, die zweite Attribut in XML und Index 1 in String [] in ArrayList ist.

Ich muss zuerst jede Schule durchlaufen (Knoten in XML, String [] in Java) und dann muss ich State (State-Attribut in XML, String [1] in Java) filtern.

Ist es jetzt klar?

+3

Ich habe keine Arraylist überall sehen, und alles, was in der Zeichenfolge Array ist identisch ... – BoltClock

+1

Bitte versuchen Sie es etwas weiter zu erklären, geben Sie einige Eingabeparameter und ausgenommene Ergebnisse ein. – Crozin

Antwort

28

beginnen mit Collections.sort, the one that takes a custom Comparator. Sie müssen dazu auch eine benutzerdefinierte Comparator schreiben.

Zum Beispiel, vorausgesetzt, Sie sind auf die natürliche Ordnung der Strings verlassen wollen, wie in ihrem compareTo-Methode definiert:

public static void main(String[] args) throws Exception { 
     ArrayList<String[]> listOfStringArrays = new ArrayList<String[]>(); 
     listOfStringArrays.add(new String[] {"x","y","z"}); 
     listOfStringArrays.add(new String[] {"a","b","c"}); 
     listOfStringArrays.add(new String[] {"m","n","o"}); 
     Collections.sort(listOfStringArrays,new Comparator<String[]>() { 
      public int compare(String[] strings, String[] otherStrings) { 
       return strings[1].compareTo(otherStrings[1]); 
      } 
     }); 
     for (String[] sa : listOfStringArrays) { 
      System.out.println(Arrays.toString(sa)); 
     } 
     /* prints out 
      [a, b, c] 
      [m, n, o] 
      [x, y, z] 
     */ 

    } 
3

Sie schreiben eine Comparator, die zwei String[] mit dem richtigen Kind vergleicht, und dann übergeben Sie es an Collections.sort(List<T> list, Comparator<? super T> c).

4

Sie ein erstellen Comparator<String[]> wie so:

new Comparator<String[]>() { 
    public int compare(String[] first, String[] second) { 
    return first[1].compareTo(second[1]); 
    } 
} 

dann geben sie nicht an Collections.sort().

Sie können überprüfen, ob das zweite Element tatsächlich im Array vorhanden ist. Sie können auch einen benutzerdefinierten Vergleich durchführen, wenn der Standard-String-Vergleich nicht ausreicht.

+0

Ich denke darüber nach, wie es die ganze ArrayList nach Staat in aufsteigender Reihenfolge sortieren würde? – Neutralizer

+1

Es wäre in aufsteigender Reihenfolge, wie Jorn und ich es präsentierten. Wenn Sie es in einer anderen Reihenfolge wünschen, können Sie den von String.compareTo (String) zurückgegebenen Wert entweder negieren oder einfach Collections.reverse (yourList) aufrufen, nachdem Sie das erste Mal sortiert haben. – whaley

0

Basierend auf Ihrer Bearbeitung: Ihr String [] sollte ein School-Objekt sein, das Ihre Attribute enthält. Machen Sie Ihr School-Objekt vergleichbar zu implementieren, und dies ermöglicht eine einfache Sortierung mit Collections.sort().

0

Dies ist extrem einfach mit Java 8 zu tun.Schreiben Sie einfach:

list.sort(Comparator.comparing(a -> a[1])); 

Zum Beispiel der folgende Code:

List<String[]> list = Arrays.asList(
    new String[] { "abc", "abc", "abc", "abc", "abc", "abc", "abc" }, 
    new String[] { "xyz", "xyz", "xyz", "xyz", "xyz", "xyz", "xyz" }, 
    new String[] { "fgh", "fgh", "fgh", "fgh", "fgh", "fgh", "fgh" }); 

list.sort(Comparator.comparing(a -> a[1])); 
list.stream().map(Arrays::toString).forEach(System.out::println); 

Wird das gewünschte Ergebnis liefern:

[abc, abc, abc, abc, abc, abc, abc] 
[fgh, fgh, fgh, fgh, fgh, fgh, fgh] 
[xyz, xyz, xyz, xyz, xyz, xyz, xyz] 
Verwandte Themen