java - 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) 等...帮助将不胜感激
解决方案
- 使用 TreeMap<Integer, Integer>
- 将频率设为 Key,因此 TreeMap 保持排序顺序。
- 遍历 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;
}
}
}
}
推荐阅读
- angular - Angular:使用innerHTML并禁用缓存时单击时重新加载图像
- qt - QCompleter 中的 QLineEdit 不显示所有项目
- loops - 如何在 with_itema 循环中的条件下设置 Ansible 变量的值
- java - 即使您在内部使用类级别变量,使用@Autowired anno 并且从不调用 bean 上的 set 方法是否提供线程安全?
- swiftui - SwiftUI Splitview DetailView 不在导航中?
- html - 轮播:Y轴,幻灯片更改时不显示数字
- java - 使用 Selenium 和 Java 9 执行自动化测试时发生非法反射访问操作
- angular - 如何将另一个组件的输出值绑定到我的组件中的表单控件
- python - 尝试使用 OpenCV 显示图像时,Jupyter 内核崩溃
- arrays - 使用“comm”查找两个数组之间的匹配项