获取与Map中相应最大值相关联的键(TreeMap / HashMap)

时间:2016-07-31 13:26:18

标签: java generics hashmap key-value treemap

我编写了下面的代码,在JAVA中使用TreeMap找出具有最大值(Integer)的键(String)。

public static void maxprofitItem(int[] costs, int[] prices, int[] sales,String[] items) {
    TreeMap<String,Integer>map=new TreeMap<String,Integer>();
    int[] profits=new int[items.length];
    int maxvalue;

    for(int i=0;i<items.length;i++){
        profits[i]=sales[i]*prices[i]-costs[i]*sales[i];
        if(profits[i]>0){
            map.put(items[i],profits[i]);
        }
    }

    Set setOfKeys = map.keySet();
    Iterator iterator = setOfKeys.iterator();
    while (iterator.hasNext()) {
        String key = (String) iterator.next();
        Integer value = (Integer)map.get(key);

        System.out.println("Key: "+ key+", Value: "+ value);
    }


    if(!map.isEmpty()){
        System.out.println("The maximum value is "+(Collections.max(map.values())));
        System.out.println("And it is for");
        maxvalue=Collections.max(map.values());
        for (Entry<String, Integer> entry : map.entrySet()) {  
            if (entry.getValue()==maxvalue) {
                System.out.println(entry.getKey());
                break;
            }
        }   
    }

    else{
        System.out.println("There are no profits in this sale");
    }
}

maxprofitItem方法获取以下参数作为参数。

传递费用值 {} 100,120,150,1000 传递价格值 {} 110,110,200,2000 传递销售价值 {} 20,100,50,3 传递项目值 {“TV”,“显卡”,“外置硬盘”,“显示器”}

该方法计算利润并将项目(Key)和利润(Value)放在TreeMap中。树形图如下所示。

Key:Monitor,Value:3000

键:外置硬盘,值:2500

重点:电视,价值:200

TreeMap和HashMap以相同的方式放置键/值对组合。 有没有更好的方法来使用TreeMap来找出与最大值相关联的键,因为它在这方面与HashMap的操作方式相同。

提前致谢。

2 个答案:

答案 0 :(得分:3)

诀窍在于,您可以通过提供按值比较条目的Comparator来找到最大值及其密钥。

Comparator<Map.Entry<String, Integer>> byValue = Map.Entry.comparingByValue();
Map.Entry<String, Integer> maxEntry = Collections.max(map.entrySet(), byValue);
System.out.println("Maximum value is " + maxEntry.getValue());
System.out.println("And it is for " + maxEntry.getKey());

或使用新的流API

map.entrySet().stream()
    .max(Map.Entry.comparingByValue())
    .ifPresent(maxEntry -> {
        System.out.println("Maximum value is " + maxEntry.getValue());
        System.out.println("And it is for " + maxEntry.getKey());
    });

答案 1 :(得分:1)

您似乎在问:使用TreeMap代替HashMap是否会为您提供更简单的方法来查找与最大值对应的密钥/

答案是......不幸的是......不。