java - 基于可配置顺序的比较器

标签 java

有没有办法按照这个例子编写自定义比较器:

最多有 10 件商品以随机顺序进入 即

first item:  item_one
second:      second_one
third:       third_one

我希望结果按如下方式排序:second_onethird_onefirst_one。我想从配置文件中提取这个顺序,有点像排序模板。

我是否使用了错误的数据结构,有人对此有经验吗?

最佳答案

当然。这是一个“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);
    }

}

这里是一些测试代码。 (我使用 List 而不是 Set 因为它 1)在谈论元素的顺序时看起来更自然,并且 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);
    }

}

输出:

[sit, ipsum, sit, lorem, dolor, lorem, ipsum, lorem]
[lorem, lorem, lorem, ipsum, ipsum, dolor, sit, sit]

关于java - 基于可配置顺序的比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5477511/

相关文章:

java - Thymeleaf 计数每个循环中的匹配项(对象数组)

java - 针对 XSD 进行 XML 验证时出错

java - Android Studio - 从 GetIdToken 获取 Firebase token

java - 为什么我不能用美元符号分割字符串?

java - 如何在 Unix/Linux 中使用 java 获取正在运行的进程详细信息

java - 如何加入现有的 SwingWorker

c# - 为什么从 Java 和 C# 中删除 constness?

java - Java 中 Arraylist 的 get 和 set 方法

java - 聊天客户端传输时文本丢失

java - 在jsp中调用java文件