gpt4 book ai didi

java - 在嵌套 HashMap 中按多个键排序

转载 作者:行者123 更新时间:2023-12-01 23:10:56 25 4
gpt4 key购买 nike

我目前有一个设置,其中数据结构是 ArrayList,每个键都包含 ArrayList 中每个键的 HashMap。我想做的是能够按 HashMap 本身中的一个或多个键进行排序。在我的研究中,大多数建议似乎是使用 Collections.sort(ArrayList, comparatorFunction()),然后构建一个自定义 Comparator 函数来进行排序,但作为一个完全的菜鸟,如何构建一个 Comparator...我不知道甚至不知道从哪里开始,更不用说构建一个我确信不是一个简单的设置了。有人碰巧知道一些可用于解决此类功能的资源吗?

编辑:抱歉,一些示例结构会有所帮助。

如果你调用 arrayList.get(0) 并对其执行 System.out.println ,它将返回 {town=Toronto, Population=2,500,000, Age=147},我想做的是这样我就可以说按人口排序 ArrayList,然后按年龄排序。

最佳答案

通常在这种情况下,比较器的工作就是简单地返回来自其他对象的比较值。例如,这是一个按字母顺序排列字体的比较器:

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));
}
}

这是一个比较 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这表明您要排序的人口是一个字符串(因为大概它与多伦多位于同一张 map 中)。将 Population 与 String 进行比较可能是不需要的,因为它将按字典顺序排序(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 可能会更有利。然后您可以将数字字段设置为数字类型。如果您有一个类,则比较基本上是相同的:只是返回所选字段的比较。

关于java - 在嵌套 HashMap 中按多个键排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21976785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com