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

时间:2017-05-17 07:16:48

标签: java sorting dictionary collections

我有以下地图:

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

1 个答案:

答案 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;
}