我有以下地图:
Map<Long, List<Address>> map = new HashMap<Long, List<Address>>();
,其中包含成对的键和值。 例如:key = 学生ID 和
value =地址列表。 在Address对象中,我有国家/地区名称(字符串)。 我想按国家/地区名称对整个地图进行排序。我尝试了很多方法,但没有得到想法。有任何想法吗? 以下是我尝试过的代码。
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;
}
答案 0 :(得分:0)
您可以在方法中创建临时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;
}