2013-12-13 186 views
5

我有一個對象列表,我想按照定義的順序對它進行排序。 例如。我有一個字段String color的對象。我想排序的色域我的列表,以便它總是第一個白色的比人比黃花藍比所有其他人(如果可能的話ALPH訂購但不是必需的。):按特定順序排序(數組)列表

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

是否有一個(易)的方式來做到這一點?

編輯:

我要補充的併發症更多...
如果可以有更多的色彩具有相同名稱/基數?例如。 whiteX,whiteY,whiteZ,blueA,blueB,...
所有的白人必須比所有的黃色和所有的黃色都優先。用比較器還能解決這個問題嗎? (我不能想象有...)

回答

8

是的,你可以創建你的排序策略創建Comparator,或定義你的類實現Comparable

補充說明的自然順序

強烈建議,但沒有嚴格要求 (則x.compareTo(Y)== 0)==(x.equals(Y))

Ë使用比較器的示例:

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 
      }  
} 

} 

並在客戶端代碼中。

例子:

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

瞭解更多:Collections#sort(..)

如果你要定義類的自然排序只是定義

public class MyClass implements Comparable<MyClass>{ 

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

而在客戶端代碼:

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

這也許值得一提的[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補充:) – nachokk

1

你可以使用comparator

你可以做的另一件事是設置一些數值(比如說1到n)。例如你的情況給予白1,給藍2,給黃3,現在排序這些數字。

9

這裏是另一種選擇:

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]