通常在这种情况下,比较器的工作是简单地从其他东西返回一个比较值。例如,这里是一个比较会按字母顺序排列的字体:
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