通常在这种情况下,比较器的工作是简单地从其他东西返回比较值。例如,这里有一个 Comparator,它将按字母顺序排列 Fonts:
class FontAlphabetizer
implements Comparator<Font> {
@Override
public int compare(Font font1, Font font2) {
return font1.getName().compareTo(font2.getName());
}
}
这其实很简单:getName 返回一个字符串,我们所做的就是返回 String 的 compareTo 方法的值。
在这里,您似乎拥有ArrayList<Map>,并且您希望根据从地图中选择的值对 ArrayList 进行排序。所以你需要的是Comparator<Map>。您需要为 Comparator 提供您想要排序的相应值的键。这可以概括如下:
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));
}
}
这是一个比较 Map 的 Comparator,它在声明中指定 Map 的值也必须是 Comparable。它根据从给定键中检索到的值进行比较。
例如,如果我们有一个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 在 2,500,000 之后,因为 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 可能是有利的。然后你可以让数字字段是数字类型。如果你有一个类,那么比较基本上是一样的:只是返回一个选定字段的比较。