比较器基于可配置的顺序

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

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

first item: item_one second: second_one third: third_one 

我想要将结果排序为: second_onethird_onefirst_one 。 我想从配置文件中提取此顺序,有点像排序模板。

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

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

 class OrderedComparator implements Comparator { List 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 someList = new ArrayList(); // 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] 

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

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

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

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

您还可以查看对其元素进行排序的TreeSet ,但依赖于正在排序的集合通常不是一个好主意。