gpt4 book ai didi

java - 如何在Java中按值嵌套值(ArrayList)对Map进行排序?

转载 作者:行者123 更新时间:2023-11-30 06:43:33 26 4
gpt4 key购买 nike

我有以下 map :

Map<Long, List<Address>> map = new HashMap<Long, List<Address>>();

其中充满了键和值对。例如:key = 学生 ID

值 = 地址列表。在地址对象中,我有国家/地区名称(字符串)。我想按国家/地区名称对总 map 进行排序。我尝试了很多方法但没有得到这个想法。有任何想法吗?下面是我尝试过的代码。

private static Map<Long, List<Address>> sortByValue(Map<Long, List<Address>> unsortMap) {

// Convert Map to List of Map
List<Map.Entry<Long, List<Address>>> unSortedList =
new ArrayList<Map.Entry<Long, List<Address>>>(unsortMap.entrySet());

// sort the List
Collections.sort(unSortedList, new Comparator<Map.Entry<Long, List<Address>>>() {
public int compare(Map.Entry<Long, List<Address>> object1,
Map.Entry<Long, List<Address>> object2) {
// sort by country name
return ???;
}
});

// Loop the sorted list and put it into a new insertion order Map LinkedHashMap
Map<Long, List<Address>> sortedMap = new LinkedHashMap<Long, List<Address>>();

for (Map.Entry<Long, List<Address>> entry : unSortedList) {
sortedMap.put(entry.getKey(), entry.getValue());

}
return sortedMap;
}

最佳答案

您可以在方法内创建一个临时的 TreeMap 并将反向映射(即国家/地区 -> 键)存储到其中。完成后,您可以对其进行迭代并在结果中填充值,例如:

public static Map<Long, List<Address>> sort(Map<Long, List<Address>> map){

//Create temporary map, sorted by countries
Map<String, List<Long>> countryMap = new TreeMap<>();

map.entrySet().stream()
.forEach(e -> {
e.getValue()
.stream()
.map(a -> a.country)
.forEach(c -> countryMap.computeIfAbsent(c, k -> new ArrayList<Long>()).add(e.getKey()));
});

//Iterate over treemap and populate the values in result
Map<Long, List<Address>> sortedMap = new LinkedHashMap<>();
countryMap.entrySet()
.stream()
.flatMap(e -> e.getValue().stream())
.forEach(k -> sortedMap.put(k, map.get(k)));

return sortedMap;
}

关于java - 如何在Java中按值嵌套值(ArrayList)对Map进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44018052/

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