java,给定一个HashMap,如何根据频率(以HM为单位)将HM数字组织到一个新数组中?
给定一个具有键值的HM,值=重复次数 我们按最高频率到最低频率排序。 若两个元素具有相同的频率,我们将按增加的值进行排序 现在我想把这个HM按照数字频率(同一个数字重复了多少次)对它进行排序,然后把它放在一个新的数组中。这是我构建的功能(但不起作用),我如何修复它,甚至使它更有效java,给定一个HashMap,如何根据频率(以HM为单位)将HM数字组织到一个新数组中?,java,arrays,loops,hashmap,numbers,Java,Arrays,Loops,Hashmap,Numbers,给定一个具有键值的HM,值=重复次数 我们按最高频率到最低频率排序。 若两个元素具有相同的频率,我们将按增加的值进行排序 现在我想把这个HM按照数字频率(同一个数字重复了多少次)对它进行排序,然后把它放在一个新的数组中。这是我构建的功能(但不起作用),我如何修复它,甚至使它更有效 public static void findMostFrequent(int[] ar,HashMap<Integer, Integer> t) { int frequency=ar[0],k=0
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);
}
}
}
}
publicstaticvoidfindmostcredent(int[]ar,HashMap t){
int频率=ar[0],k=0;
对于(int i:t.keySet()){
for(int j:t.keySet()){//string(word):将所有值放在一起
如果(t.get(j)>频率){
频率=t.get(j);
对于(int l=k;l我想到的一个解决方案是首先按如下值对hashmap排序:
Map<Integer, String> sortedMap =
unsortedMap.entrySet().stream()
.sorted(Entry.comparingByValue())
.collect(Collectors.toMap(Entry::getKey, Entry::getValue,
(e1, e2) -> e1, LinkedHashMap::new))
Map-sortedMap=
unsortedMap.entrySet().stream()
.sorted(Entry.comparingByValue())
.collect(Collectors.toMap)(条目::getKey,条目::getValue,
(e1,e2)->e1,LinkedHashMap::new)
然后迭代新的linkedHashmap以生成结果数组
使用树形图
将频率作为键,这样TreeMap保持排序顺序
迭代键集并收集值
如果您没有使用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;
}
}
}
}
publicstaticvoidfindmostcredent(int[]ar,HashMap t){
TreeMap sortedByVal=新的TreeMap(Comparator.reverseOrder());
int size=0;
for(int键:t.keySet()){
int val=t.get(键);
sortedByVal.putIfAbsent(val,new HashSet());
设置键=sortedByVal.get(val);
key.add(key);
分拣YVAL.put(val,钥匙);
大小+=val;
}
ar=新整数[大小];
int i=0;
for(整数键:sortedByVal.keySet()){
for(int val:sortedByVal.get(键)){
对于(int j=0;j
谢谢,但我不知道java的流,所以这并没有真正的帮助,因为我不能真正理解代码中发生了什么。无论如何,谢谢我使用了它,但它在新数组的每个部分都放了0-ar-不适用(int j=0;j