Obtaining key associated with corresponding maximum value in a Map(TreeMap/HashMap)

浪尽此生 提交于 2019-12-20 02:57:21

问题


I have written the below code to find out the key(String) that has the maximum value(Integer) using TreeMap in JAVA.

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");
    }
}

The method maxprofitItem gets the below parameters as arguments.

Pass the costs values {100,120,150,1000} Pass the prices values {110,110,200,2000} Pass the sales values {20,100,50,3} Pass the items values {"TV","Graphics card","External Hard disk","Monitor"}

The method calculates the profits and puts the items(Key) and profits(Value) in TreeMap.And the TreeMap looks like below.

Key: Monitor, Value: 3000

Key: External Hard disk, Value: 2500

Key: TV, Value: 200

TreeMap and HashMap puts the key/value pair combination in the same manner. Is there a better way to use TreeMap inorder to find out the key assocaited with the maximum value as it operates in the same manner as HashMap in this regard.

Thanks in advance.


回答1:


The trick is that you can find maximum value together with its key by providing Comparator that compares entries by value.

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());

Or using new stream 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());
    });



回答2:


You seem to be asking if using TreeMap instead of HashMap will give you a simpler way to find the key corresponding to the largest value/

The answer to that is ... unfortunately ... No.



来源:https://stackoverflow.com/questions/38684432/obtaining-key-associated-with-corresponding-maximum-value-in-a-maptreemap-hashm

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!