java 按键升序重新排列Hashmap对中的重复值

dbf7pr2w  于 2023-05-27  发布在  Java
关注(0)|答案(1)|浏览(130)

我想用java写一段代码,它接受一个按降序排序的hashMap。它只重新排列有多个重复值的对,并按键升序排列它们。所以{7=4,17=2,5=2} hashMap的结果是{7=4, 5=2, 17=2}。再举一个例子,{7=4, 11=3 , 18=3 , 35=3, 2=2, 5=1, 11,1}将等于{7=4, 11=3 , 18=3 , 35=3, 2=2, 5=1, 11,1},因为所有的副本都已经按升序键排序。下面的代码是错误的,没有给予所描述的预期值。请更改下面的代码,以执行其应该执行的操作。输出中也缺少对11=3

Input:{7=4, 11=3 , 18=3 , 35=3, 2=2, 5=1, 11,1}
Output: {2=2, 18=3, 35=3, 5=1, 7=4, 11=1}
Expected Output: {7=4, 11=3 , 18=3 , 35=3, 2=2, 5=1, 11=1}

密码

import java.util.*;

public class HashMapSort {
    public static void main(String[] args) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        hashMap.put(7, 4);
        hashMap.put(11, 3);
        hashMap.put(18, 3);
        hashMap.put(35, 3);
        hashMap.put(2, 2);
        hashMap.put(5, 1);
        hashMap.put(11, 1);
        System.out.println("Before rearranging: " + hashMap);
        HashMap<Integer, Integer> rearrangedHashMap = rearrangeHashMap(hashMap);
        System.out.println("After rearranging: " + rearrangedHashMap);
    }

    public static HashMap<Integer, Integer> rearrangeHashMap(HashMap<Integer, Integer> hashMap) {
        HashMap<Integer, Integer> rearrangedHashMap = new HashMap<>();
        // Group the values by count and by whether they have duplicates
       HashMap<Integer, List<Integer>> groupedValues = new HashMap<>();
        for (Map.Entry<Integer, Integer> entry : hashMap.entrySet()) {
            int key = entry.getKey();
            int value = entry.getValue();
            if (value > 1) {
                groupedValues.computeIfAbsent(value, k -> new ArrayList<>()).add(key);
            } else {
                rearrangedHashMap.put(key, value);
            }
        }
        // Rearrange the groups with multiple values
        for (Map.Entry<Integer, List<Integer>> entry : groupedValues.entrySet()) {
            int value = entry.getKey();
            List<Integer> keys = entry.getValue();
            Collections.sort(keys, Collections.reverseOrder());
            for (int key : keys) {
                rearrangedHashMap.put(key, value);
            }
        }
        return rearrangedHashMap;
    }
}
sy5wg1nm

sy5wg1nm1#

这里有一个可能的解决方案来解决你的问题。
首先,您可以使用Map<Integer, List<Integer>>,作为一种在每个键中保存多个值的方法。
添加新值时,使用Comparator.reverseOrderList进行排序。

public class Example {
    Map<Integer, List<Integer>> map = new LinkedHashMap<>();

    void add(int key, int value) {
        if (!map.containsKey(key))
            map.put(key, new ArrayList<>(List.of(value)));
        else {
            map.get(key).add(value);
            map.get(key).sort(Comparator.reverseOrder());
        }
    }
}

下面是一个示例用法

Example example = new Example();
example.add(7, 4);
example.add(11, 3);
example.add(18, 3);
example.add(35, 3);
example.add(2, 2);
example.add(5, 1);
example.add(11, 1);

System.out.println(example.map);

输出量

{7=[4], 11=[3, 1], 18=[3], 35=[3], 2=[2], 5=[1]}

相关问题