java,给定一个HashMap,如何根据频率(以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

给定一个具有键值的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);
              }
              }
    }
}
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