[英]Comparator based on a configurable order
有沒有辦法編寫自定義比較器,遵循此示例:
最多有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]
看一下TreeSet(http://download.oracle.com/javase/6/docs/api/java/util/TreeSet.html)。 您可以在構造函數中提供自定義Comparator。 此比較器將考慮您的配置。 檔案。 因為你想要任意順序,比較器的邏輯不會很漂亮。 您很可能最終會列舉所有可能的比較。
集合存儲無序元素。 如果你想進行比較和排序,你應該選擇一個列表。 這是給你的快速片段:
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
,但依賴於所訂購的集合通常不是一個好主意。
使用Guava的com.google.common.collect.Ordering:
Ordering.explicit(second_one, third_one, first_one);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.