Java,按自定义alpha顺序排序arraylist

时间:2017-04-07 17:02:32

标签: java sorting arraylist

我们说我有

arrayList<String> fruits

包含

{"banana", "apple", "grape", "banana", "banana", "grape"}

我知道如何使用比较器(如下)按字母顺序排序:

Collections.sort(fruits, new Comparator<Fruit>() {
        public int compare(Fruit o1, Fruit o2) {
            return o1.getName().compareTo(o2.getName());
        }
    });

然而,这会给我{&#34; apple&#34;,&#34; banana&#34;,&#34; banana&#34;,&#34; banana&#34;,&#34; grape& #34;,&#34;葡萄&#34;}。我怎么改变这个,所以我先把所有的香蕉,然后是苹果,然后是葡萄?谢谢!

2 个答案:

答案 0 :(得分:3)

这可能有助于您入门:

List<String> fruitsOrder = Arrays.asList(new String[]{"banana","apple","grape"});
Comparator<String> c = Comparator.comparingInt(str -> fruitsOrder.indexOf(str));

您可以通过规范化案例和/或使用Comparator.thenComparing进一步优化它,以便对不在列表中的水果有一致的顺序。

答案 1 :(得分:0)

您可以先创建自定义比较器:

public static class CustomFruitComparator implements Comparator<String> {

    Map<String, Integer> fruitsOrder;

    public CustomFruitComparator(Map<String, Integer> fruitsOrder) {
        this.fruitsOrder = fruitsOrder;
    }

    @Override
    public int compare(String o1, String o2) {
        if (fruitsOrder.get(o1) > fruitsOrder.get(o2))
            return 1;
        else if (fruitsOrder.get(o1) < fruitsOrder.get(o2))
            return -1;
        return 0;
    }

}

然后您可以使用它来对您的收藏品进行排序。在你的情况下,你可以这样做:

List<String> fruits = Arrays.asList(new String[]{"banana", "apple", "grape", "banana", "banana", "grape"});

    Map<String, Integer> fruitsOrder = new HashMap<>();
    fruitsOrder.put("banana", 1);
    fruitsOrder.put("apple", 2);
    fruitsOrder.put("grape", 3);

    Collections.sort(fruits, new CustomFruitComparator(fruitsOrder));