2013-12-13 14 views
5

Mam listę obiektów i chciałbym posortować ją według określonej kolejności. Na przykład Mam obiekt z polem String color. Chciałbym uporządkować moją listę na polu koloru tak, że ma zawsze pierwszy biały niż niebieski niż żółty i niż wszystkie inne (jeśli to możliwe alph uporządkowane, ale nie jest to konieczne.):Sortowanie listy (tablica) z określonym zamówieniem

Before sorting:   After sorting: 
orange     white 
white     blue 
green     yellow 
brown     orange 
yellow     black 
black     brown 
...      ... 

Czy istnieje (prosty) sposób to zrobić?

EDIT:

muszę dodać powikłanie więcej ...
Co zrobić, jeśli nie może być więcej kolorów o tej samej nazwie/radix? Na przykład whiteX, whiteY, whiteZ, blueA, blueB, ...
Wszyscy biali muszą być pierwsi niż wszyscy bluesi niż wszyscy żółci i wszyscy inni. Nadal można to rozwiązać za pomocą komparatora? (Nie mogę sobie wyobrazić, jak ...)

Odpowiedz

8

Tak można utworzyć Comparator za tworzenie strategii sortowania, lub zdefiniować naturalny porządek swojej klasie wykonawczego Comparable

Na marginesie:

zaleca się, jednak nie jest to bezwzględnie wymagane, (x.compareTo (Y) == 0) == (x.equals (Y))

E Przykład użycia komparatora:

class MyClass { 

private Color color; 
private String someOtherProperty; 
public static final Comparator<MyClass> colorComparator = new MyComparator(); 

//getter and setter 

static class MyComparator implements Comparator<MyClass>{ 

      @Override 
      public int compare(MyClass o1, MyClass o2) { 
       // here you do your business logic, when you say where a color is greater than other 
      }  
} 

} 

I w kodzie klienta.

Przykład:

List<MyClass> list = new ArrayList<>(); 
//fill array with values 
Collections.sort(list, MyClass.colorComparator); 

Więcej: Collections#sort(..)

Jeśli chcesz określić naturalny uporządkowania swojej klasie wystarczy zdefiniować

public class MyClass implements Comparable<MyClass>{ 

     @Override 
     public int compareTo(MyClass o) { 
      // do business logic here 
     } 
} 

iw kodzie klienckim:

Collections.sort(myList); // where myList is List<MyClass> 
+0

To chyba warto wspomnieć [Collections.sort] (http://docs.oracle.com/javase/7/docs/api/java/util/Collections. html # sort% 28java.util.List,% 20java.util.Comparator% 29) – McDowell

+0

@McDowell added :) – nachokk

1

możesz użyć comparator.

Kolejną rzeczą, którą możesz zrobić, to ustawić wartości (powiedz 1 do n) na liczby. Na przykład w twoim przypadku podaj biały 1, daj niebieski 2, daj żółty 3. teraz sortuj te liczby.

9

tutaj jest inna opcja:

Map<Integer, String> tree = new TreeMap<Integer, String>(); 
    List<String> listOrdre = Arrays.asList("white", "blue", "yellow", "orange", "black", "brown"); 
    List<String> myList = Arrays.asList("orange", "white", "brown", "yellow", "black"); 

    for (String code : myList) { 
     tree.put(listOrdre.indexOf(code), code); 
    } 

    System.out.println(tree.values()); // -> [white, yellow, orange, black, brown] 
Powiązane problemy