比较器基于可配置的顺序

时间:2011-03-29 18:58:02

标签: java

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

随机订单最多有10件商品 即

first item:  item_one
second:      second_one
third:       third_one

我希望将结果排序为:second_onethird_onefirst_one。我想从配置文件中提取这个顺序,有点像模板进行排序。

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

4 个答案:

答案 0 :(得分: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);
    }

}

这是一些测试代码。 (我使用List而不是Set,因为它1)在讨论元素的顺序时看起来更自然; 2)更好地说明在使用此比较器排序时重复元素会发生什么。)< / p>

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]

答案 1 :(得分:2)

看一下TreeSet(http://download.oracle.com/javase/6/docs/api/java/util/TreeSet.html)。您可以在构造函数中提供自定义Comparator。此比较器将考虑您的配置。档案。因为你想要任意顺序,比较器的逻辑不会很漂亮。你很可能最终会列举所有可能的比较。

答案 2 :(得分:1)

集合存储无序元素。如果你想进行比较和排序,你应该选择一个列表。这是给你的快速片段:

List<X> sorted = new ArrayList<X>(myset);
Collections.sort(sorted, new Comparator<X>() {
    public int compare(X o1, X o2) {
        if (/* o1 < o2 */) {
            return -1;
        } else if (/* o1 > o2 */) {
            return 1;
        } else {
            return 0;
        }
    }
});

现在你有了sorted,它具有myset的所有相同元素,由于是一个集合而无序。

您还可以查看TreeSet,它会对其元素进行排序,但依靠订购的集合通常不是一个好主意。

答案 3 :(得分:0)

使用番石榴的com.google.common.collect.Ordering:

Ordering.explicit(second_one, third_one, first_one);