比较器基于可配置的顺序

Lon*_*don 12 java

有没有办法编写自定义比较器,遵循此示例:

最多有10个项目以随机顺序进入,即

first item:  item_one
second:      second_one
third:       third_one
Run Code Online (Sandbox Code Playgroud)

我想他们产生进行排序,如:second_one,third_one,first_one.我想从配置文件中提取此顺序,有点像排序模板.

我使用错误的数据结构,有没有人有这方面的经验?

aio*_*obe 17

当然.这是一个" OrderedComparator",它根据预定义的顺序比较元素:

class OrderedComparator implements Comparator<String> {

    List<String> predefinedOrder;

    public OrderedComparator(String[] predefinedOrder) {
        this.predefinedOrder = Arrays.asList(predefinedOrder);
    }

    @Override
    public int compare(String o1, String o2) {
        return predefinedOrder.indexOf(o1) - predefinedOrder.indexOf(o2);
    }

}
Run Code Online (Sandbox Code Playgroud)

这是一些测试代码.(在讨论元素的顺序时,我使用了a List而不是a Set1)看起来更自然; 2)更好地说明在使用此比较器进行排序时,重复元素会发生什么.)

class Test {

    public static void main(String[] args) {

        // Order (could be read from config file)
        String[] order = { "lorem", "ipsum", "dolor", "sit" };


        List<String> someList = new ArrayList<String>();

        // Insert elements in random order.
        someList.add("sit");
        someList.add("ipsum");
        someList.add("sit");
        someList.add("lorem");
        someList.add("dolor");
        someList.add("lorem");
        someList.add("ipsum");
        someList.add("lorem");


        System.out.println(someList);

        Collections.sort(someList, new OrderedComparator(order));

        System.out.println(someList);
    }

}
Run Code Online (Sandbox Code Playgroud)

输出:

[sit, ipsum, sit, lorem, dolor, lorem, ipsum, lorem]
[lorem, lorem, lorem, ipsum, ipsum, dolor, sit, sit]
Run Code Online (Sandbox Code Playgroud)

  • OP希望Set不是List (3认同)
  • 我的动机是为什么我在答案中选择了List而不是Set. (3认同)
  • 出于效率原因,我建议将List从元素更改为Map,但这正是我要编写的内容.:-) (2认同)