2012-11-14 18 views
8

So che Collections.sort(myArrayList) può ordinare un array in ordine alfabetico quando sono stringhe, ma che dire quando sono qualcosa di più complesso come un oggetto dati contenente due o più variabili, tra cui un String. C'è un modo per ordinarli allora?ordinamento arraylist di oggetti complessi alfabeticamente

Se non c'è un modo con Collections, allora posso immaginare di creare un ciclo for o un algoritmo di ordinamento standard per esaminare la variabile delle stringhe di ciascun oggetto e spostare l'indice dell'oggetto nell'array.

Ma mi chiedevo soprattutto se ho trascurato qualcosa sui metodi Collections

+0

La biblioteca Guava ha un grande out-of-the -box supporto per la creazione di comparatori compositi. Controlla. –

+0

questo potrebbe aiutare anche http://stackoverflow.com/questions/2839137/how-to-use-comparator-in-java-to-sort – Adrian

+0

Leggere il JavaDoc ti indirizzerà nella giusta direzione. – Raedwald

risposta

26

Utilizzare the function taking as second parameter a Comparator.

Il consente di passare un'istanza di Comparator per ordinare in base alle proprie esigenze. Si noti che lo javadoc of Comparator contiene le linee guida relative alla costruzione di comparatori.

È possibile definire il comparatore come classe anonima solo se utilizzato localmente. Ecco un esempio in cui ho ordinare gli oggetti per quanto riguarda ad uno dei loro campi che è una stringa:

Collections.sort(groupResults, new Comparator<ProductSearchResult>() { 
    public int compare(ProductSearchResult result1, ProductSearchResult result2) { 
     return result1.product.getRsId().compareTo(result2.product.getRsId()); 
    } 
}); 

In alternativa, si potrebbe anche fare la classe implementi l'interfaccia Comparable ma questo ha senso solo se è possibile definire un naturale (ovvio) ordine.

+1

Inoltre, per quanto riguarda l'implementazione di Paragonabile, questo ha senso se si desidera sempre ordinare gli elenchi del tipo nello stesso modo. Se si desidera avere ordini diversi in diverse situazioni, passare un Comparatore in Collections.sort() è probabilmente la strada da percorrere. –

+2

grazie a questo è stato l'esempio più significativo di Comparator che ho visto – CQM

12

vorrei creare una classe interna che implementa l'interfaccia Comparator:

public class Car { 
public double horsePower; 

class CarHorsePowerComparator implements Comparator<Car> { 
    @Override 
    public int compare(Car car1, Car car2) { 
     return Integer.valueOf(car.horsePower).compareTo(Integer.valueOf(car2.horsePower))   } 
    } 
} 

Ora, quando si desidera ordinare l'elenco Car di Potenza:

List<Car> list = new ArrayList<Car>(myCars); //your Car list 
Collections.sort(list, new CarHorsePowerComparator()); 
Problemi correlati