有没有办法写自定义比较器,下面这个例子:
最多有10个项目以随机顺序进入
即
first item: item_one second: second_one third: third_one
我想要使它们排序像:second_one,third_one,first_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] [lorem,sit]