比较器基于可配置的顺序
有没有办法编写自定义比较器,遵循此示例:
最多有10个项目以随机顺序进入,即
first item: item_one second: second_one third: third_one
我想要将结果排序为: second_one
, third_one
, first_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
,但依赖于正在排序的集合通常不是一个好主意。