2011-01-15 22 views
12

Qual è il modo migliore per ordinare uno ArrayList<String[]> in Java?Sort ArrayList of Array in Java

Dove String [] è ...

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

Ora voglio ordinare l'intero ArrayList entro il 2 valore String [] (a indice 1). Ho bisogno di eseguire il ciclo di ogni stringa [] e poi il suo figlio in indice 1.

Qualche idea?

CURA


ho più descrizione. In realtà sto ricevendo scuole da qualche file XML e ogni nodo in XML ha 7 attributi. Ora sto creando un ArrayList di String [] che tiene in mano quei nodi scolastici dall'array XML e String [] contiene gli attributi di un particolare nodo.

Ora, il modo in cui voglio ordinarlo è, dovrebbe essere ordinato in base allo stato della scuola, che è il 2o attributo in XML e l'indice 1 in String [] all'interno di ArrayList.

Ho bisogno di passare in rassegna prima ogni scuola (nodo in XML, String [] in Java) e quindi dovrò filtrare State (attributo di stato in XML, String [1] in Java).

È chiaro ora?

+3

Non vedo alcun ArrayList ovunque, e tutto nella stringa array è identico ... – BoltClock

+1

Si prega di provare a spiegarlo un po 'di più, inserire alcuni parametri di input e risultati esclusi. – Crozin

risposta

28

Inizia con Collections.sort, the one that takes a custom Comparator. Avrai anche bisogno di scrivere una custom Comparator per questo.

Per esempio, supponendo che si desidera fare affidamento su l'ordinamento naturale delle stringhe come definito nella loro metodo compareTo:

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

Si scrive un Comparator che confronta due String[] dal figlio corretto e quindi lo si passa a Collections.sort(List<T> list, Comparator<? super T> c).

4

si crea un Comparator<String[]> in questo modo:

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

poi passarlo a Collections.sort().

Si potrebbe voler verificare se il secondo elemento è effettivamente presente nell'array. È anche possibile eseguire un confronto personalizzato se il confronto tra stringhe standard non è sufficiente.

+0

Sto pensando a come ordinare l'intero ArrayList per stato in ordine ascendente? – Neutralizer

+1

Sarebbe in ordine crescente il modo in cui sia io che Jorn lo abbiamo presentato. se lo si desidera in un altro ordine, è possibile negare il valore restituito da String.compareTo (String) o semplicemente chiamare Collections.reverse (elencoList) dopo averlo ordinato la prima volta. – whaley

0

Sulla base della modifica: Your String [] deve essere un oggetto School per contenere gli attributi. Rendi l'oggetto del tuo oggetto School comparabile e ciò consentirà un facile ordinamento con Collections.sort().

0

Questo è estremamente facile da fare con Java 8.Basta scrivere:

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

Ad esempio, il seguente codice:

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

produrrà il risultato desiderato:

[abc, abc, abc, abc, abc, abc, abc] 
[fgh, fgh, fgh, fgh, fgh, fgh, fgh] 
[xyz, xyz, xyz, xyz, xyz, xyz, xyz]