2013-12-13 130 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]