首页 > 解决方案 > java,给定一个HashMap,如何根据频率(hm)将HM数组织成一个新数组?

问题描述

给定一个具有键号的 HM,值 = 重复的次数。

我们按最高频率到最低频率排序。如果两个元素具有相同的频率,我们按增加值排序。

现在我想拿这个 HM 并根据数字频率(相同数字重复多少次)对其进行排序,并将其放入一个新数组中。这是我构建的功能(但不起作用)我该如何修复它甚至提高效率?

public static void findMostFrequent(int[] ar,HashMap<Integer, Integer> t) {
    int frequency=ar[0],k=0;
    for(int i: t.keySet()) {
        for(int j: t.keySet()) { //string(word):all the values together
              if(t.get(j)> frequency) {
                frequency=t.get(j);
                for(int l=k;l<t.get(j);l++ ) {
                    ar[k]=frequency;
                    k++;
                }
                t.remove(frequency);
              }
              }
    }
}

示例:给定 HM(hashmap) -{2=1, 3=3, 5=2, 7=2, 9=1} 我希望新数组(称为 ar)是:(3,3,3,5,5,7,7,2,9)基本上是最频繁的数字到最不频繁的单词,所以如果 3 重复了 3 次并且是重复次数最多的数字,那么在新数组中(3,3,3) 等...帮助将不胜感激

标签: javaarraysloopshashmapnumbers

解决方案


  1. 使用 TreeMap<Integer, Integer>
  2. 将频率设为 Key,因此 TreeMap 保持排序顺序。
  3. 遍历 Keyset 并收集值。

如果您没有使用 TreeMap 的选项。您可以在方法中将其转换为 TreeMap。

这是一个例子:

public static void findMostFrequent(int[] ar, HashMap<Integer, Integer> t) {
        TreeMap<Integer, Set<Integer>> sortedByVal = new TreeMap<>(Comparator.reverseOrder());

        int size=0;
        for (int key : t.keySet()) {
                int val = t.get(key);
                sortedByVal.putIfAbsent(val, new HashSet<>());

                Set<Integer> keys = sortedByVal.get(val);
                keys.add(key);
                sortedByVal.put(val, keys);
                size+=val;
            }

        ar = new int[size];
        int i = 0;
        for (Integer key : sortedByVal.keySet()) {
            for (int val : sortedByVal.get(key)) {
               for (int j = 0; j < key; j++) {
                  ar[i++] = val;
               }
            }
        }
    }

推荐阅读