我想用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;
}
}
1条答案
按热度按时间sy5wg1nm1#
这里有一个可能的解决方案来解决你的问题。
首先,您可以使用
Map<Integer, List<Integer>>
,作为一种在每个键中保存多个值的方法。添加新值时,使用
Comparator.reverseOrder
对List
进行排序。下面是一个示例用法
输出量