排序(具有特定顺序的Arraylist)

时间:2013-12-13 12:47:02

标签: java list sorting arraylist

我有一个对象列表,我想用定义的顺序对其进行排序。 对于前者我有一个带有字段String color的对象。我想在颜色区域上对我的列表进行排序,以便它总是首先是白色而不是蓝色而不是其他所有(如果可能的话,alph。已订购但不是必需的):

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

有(简单)方法吗?

编辑:

我必须更多地添加一个并发症...
如果可以有更多同名/基数的颜色怎么办?对于前者whiteX,whiteY,whiteZ,blueA,blueB,......所有的白人必须首先比所有的黄色都要先于所有的黄色而不是所有的黄色。用比较器解决这个问题仍有可能吗? (我无法想象......)

4 个答案:

答案 0 :(得分:12)

这是另一个选择:

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]

答案 1 :(得分:9)

是的,您可以创建Comparator来创建排序策略,或者定义实现Comparable的类的自然顺序

作为旁注:

  

强烈建议,但并非严格要求   (x.compareTo(y)== 0)==(x.equals(y))

使用比较器的示例:

class MyClass {

private Color color;
private String someOtherProperty;
public static final Comparator<MyClass> COLOR_COMPARATOR = 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.COLOR_COMPARATOR );

了解详情: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>

答案 2 :(得分:1)

您可以使用comparator

您可以做的另一件事是为数字设置一些值(比如1到n)。例如,在您的情况下,给予白色1,给予蓝色2,给出黄色3.现在对这些数字进行排序。

答案 3 :(得分:0)

另一种解决方案是将枚举与您的比较器一起使用,因为枚举已定义了索引(ordinal)。

首先,使用您希望其排序的顺序的值创建一个枚举。

enum class MyColour {
    WHITE,
    BLUE,
    YELLOW,
    ORANGE,
    BLACK,
    BROWN
}

对于每个对象,您都可以使用Mycolour.valueOf("WHITE")获得枚举值。注意:这是区分大小写的。

接下来,您只需使用比较器即可。

val sortedList = list.sortedBy { it.colour } // colour being the enum value we defined.