有没有办法编写自定义比较器,请遵循以下示例:
随机订单最多有10件商品 即
first item: item_one
second: second_one
third: third_one
我希望将结果排序为:second_one
,third_one
,first_one
。我想从配置文件中提取这个顺序,有点像模板进行排序。
我使用错误的数据结构,有没有人有这方面的经验?
答案 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);