有没有办法按照这个例子编写自定义比较器:
最多有 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, ipsum, lorem]
[lorem, lorem, lorem, ipsum, ipsum, dolor, sit, sit]
关于java - 基于可配置顺序的比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5477511/