我制作了这样的地图:
Map <Integer, Integer> hm = new HashMap<Integer, Integer>();
for(int i = 0; i<courses.size(); i++){
int occurrences = Collections.frequency(subs, courses.get(i).getCourseId());
hm.put(i+1, occurrences);
}
System.out.println("map:");
System.out.println(hm);
地图包含整数,一个是课程ID,另一个是课程在我的数组中出现的次数。但是现在输出是:
map:
{1=3, 2=2, 3=4}
我需要获得最高值(所以我需要第二个整数值)。我试图对有效的地图进行排序,然后我的输出是这样的:
{3=4, 1=3, 2=2}
但是我需要获取最高值并将其返回到其他值。 我想要的输出是:
3, 1, 2
当然是一个数组。 感谢您提前帮助!
编辑:我将代码更改为:
Map <Integer, Integer> hm = new TreeMap<Integer, Integer>();
for(int i = 0; i<courses.size(); i++){
int occurrences = Collections.frequency(subs, courses.get(i).getCourseId());
hm.put(occurrences, i+1);
}
并使用以下内容打印值:
hm.values();
然后我的输出是: [2,1,3] 我需要输出为[3,1,2]。
答案 0 :(得分:1)
LinkedHashMap
保留了插入顺序。
输出:
Key : 3 Value : 4
Key : 1 Value : 3
Key : 2 Value : 2
代码:
import java.util.*;
class SortMapValues {
public static boolean ASC = true;
public static boolean DESC = false;
public static void main(String[] args) {
// Creating dummy unsorted map
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(1, 3);
map.put(2, 2);
map.put(3, 4);
Map<Integer, Integer> sortedMapDesc = sortByComparator(map, DESC);
printMap(sortedMapDesc);
}
private static Map<Integer, Integer> sortByComparator(Map<Integer, Integer> map, final boolean order) {
List<Entry<Integer, Integer>> list = new LinkedList<Entry<Integer, Integer>>(map.entrySet());
// Sorting the list based on values
Collections.sort(list, new Comparator<Entry<Integer, Integer>>() {
public int compare(Entry<Integer, Integer> o1,
Entry<Integer, Integer> o2) {
if (order) {
return o1.getValue().compareTo(o2.getValue());
}
else {
return o2.getValue().compareTo(o1.getValue());
}
}
});
// Maintaining insertion order with the help of LinkedList
Map<Integer, Integer> sortedMap = new LinkedHashMap<Integer, Integer>();
for (Entry<Integer, Integer> entry : list) {
sortedMap.put(entry.getKey(), entry.getValue());
}
return sortedMap;
}
public static void printMap(Map<Integer, Integer> map) {
for (Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println("Key : " + entry.getKey() + " Value : "+ entry.getValue());
}
}
}
答案 1 :(得分:1)
你可以这样做:
int max = Integer.MIN_VALUE;
int maxKey;
for (Map<Integer, Integer> entry: map.entrySet()){
if (entry.getValue() > max){
maxKey = entry.getKey();
max = entry.getValue();
}
}
答案 2 :(得分:0)
使用TreeMap
而不是HashMap
来保持排序。
然后您想要的结果变为hm.values();
如果您想按值排序,那么只需将它们放在地图中并将得分映射到课程ID - 然后使用上面的TreeMap
。如果你有“绘制”,那么你可能需要在课程ID列表中做一个得分地图,然后决定如何处理。
答案 3 :(得分:0)
HashMap
中没有订单保证。如果您想专注于订单,则应使用LinkedHashMap
。
如果您不关注插入顺序,请更好地使用TreeMap
,因为它是已排序的。