从Map获取最高值

时间:2013-12-12 11:12:31

标签: java map hashmap

我制作了这样的地图:

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]。

4 个答案:

答案 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,因为它是已排序的。

相关问题