按枚举排序列表数据

时间:2018-07-09 11:33:35

标签: java sorting

我有一个字符串列表l=[mean,max,min,std,flag] 我还有另一个枚举

public enum ListOrder{
    mean(0), 
    std(1), 
    max(2), 
    min(3), 
    flag(100);

    private int value;

    private ListOrder(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

我的尝试:-

Collections.sort(l, new Comparator<ListOrder>() {
                    @Override
                    public int compare(ListOrder o1, ListOrder o2) {
                        // TODO Auto-generated method stub
                        return 0;
                    }
                });

但是这不起作用,因为ListOrder不是String的超类。谁能帮我怎么做。

3 个答案:

答案 0 :(得分:4)

  1. 如果List包含String,则需要提供一个Comparator<String>,它看起来像Enum才能进行排序:

    List<String> l = Arrays.asList("mean", "max", "min", "std", "flag");
    Collections.sort(l, (o1, o2) -> Integer.compare(ListOrder.valueOf(o1).getValue(), 
                                                    ListOrder.valueOf(o2).getValue()));
    

    Workable Demo


  1. 如果List直接包含ListOrder,则只需要告诉您是否按所需顺序提供Enum元素即可按值排序

    List<ListOrder> l = Arrays.asList(ListOrder.mean, ListOrder.max, ListOrder.min, ListOrder.std, ListOrder.flag);
    Collections.sort(l, Comparator.comparing(ListOrder::valueOf));
    

    Workable Demo

    如果它们按您的顺序排列,那么简单的Collections.sort(l);就足够了

答案 1 :(得分:1)

枚举已经可以与简单的Collections.sort(l);

相提并论
ArrayList<ListOrder> l = new ArrayList<ListOrder>();

l.add(ListOrder.mean);
l.add(ListOrder.max);
l.add(ListOrder.min);
l.add(ListOrder.std);
l.add(ListOrder.flag);

Collections.sort(l);

System.out.println(l.toString());

输出:

[mean, std, max, min, flag]

答案 2 :(得分:0)

我可以知道你的魔杖。

@Test
public void test() {
    List<String> l = Arrays.asList("mean", "max", "min", "std", "flag");

    Collections.sort(l, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return ListOrder.valueOf(o1).getValue() - ListOrder.valueOf(o2).getValue();
        }
    });
    for (String s : l) {
        System.out.println(s);
    }
}