通常在這種情況下,比較器的工作是簡單地從其他東西返回一個比較值。例如,這裏是一個比較會按字母順序排列的字體:
class FontAlphabetizer
implements Comparator<Font> {
@Override
public int compare(Font font1, Font font2) {
return font1.getName().compareTo(font2.getName());
}
}
這實際上是非常簡單的:getName
返回一個字符串而我們要做的就是返回字符串的方法compareTo
的價值。
在這裏它看起來像你所擁有的是ArrayList<Map>
,你想根據Map中的選定值對ArrayList進行排序。所以你需要的是一個Comparator<Map>
。您需要爲比較器提供您想要排序的相應值的關鍵字。這可以表示一般像下面這樣:
class MapValueComparator<K, V extends Comparable<V>>
implements Comparator<Map<K, V>> {
final K key;
MapValueComparator(K key) {
this.key = key;
}
@Override
public int compare(Map<K, V> map1, Map<K, V> map2) {
return map1.get(key).compareTo(map2.get(key));
}
}
這是比較地圖比較器和它在聲明中指定有該地圖的價值觀也必須是可比的。它根據從給定密鑰中檢索的值進行比較。
因此,舉例來說,如果我們有一個ArrayList<Map<String, String>>
,我們可以通過值從"town"
排序是這樣的:
static void sortByTown(List<Map<String, String>> list) {
Collections.sort(list, new MapValueComparator<String, String>("town"));
}
,打嗝是,你說你有town=Toronto, population=2,500,000
這表明人口要排序是一個字符串(因爲它可能與多倫多在相同的地圖中)。作爲字符串可能是不希望的,因爲它會按字典順序排序(50進入250萬之後,因爲5自帶2後)比較人口。在這種情況下通用版本可能無法工作,因爲你需要採取的值轉換爲數字的一個額外的步驟。
class PopulationComparator
implements Comparator<Map<String, String>> {
@Override
public int compare(Map<String, String> map1, Map<String, String> map2) {
final Long pop1 = Long.valueOf(map1.get("population"));
final Long pop2 = Long.valueOf(map2.get("population"));
return pop1.compareTo(pop2);
}
}
(而作爲一個側面說明,如果你的羣體包括你需要它解析爲數字前將其格式化。您可以使用replaceAll("\\D", "")
從字符串中刪除所有非數字的逗號。)
這也是一種情況,爲此創建一個類而不是使用Map可能會有好處。那麼你可以讓數字字段爲數字類型。如果你有一堂課,比較將大致相同,只是返回一個選定字段的比較。
[如何使用比較器接口](http://stackoverflow.com/questions/16126563/how-to-use-the-comparator-interface) – mazaneicha
*「一個ArrayList,每個鍵包含一個HashMap對於ArrayList中的每個鍵「* ArrayList沒有鍵,所以......你是什麼意思?你能舉一個例子說明這些是如何聲明的以及你想要排序的嗎? – Radiodef