Получение ключа, связанного с соответствующим максимальным значением на карте (TreeMap / HashMap)

Я написал код ниже, чтобы узнать ключ (String), который имеет максимальное значение (Integer), используя TreeMap в 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");
    }
}

Метод maxprofitItem получает следующие параметры в качестве аргументов.

Передайте значения затрат {100,120,150,1000} Передайте значения цен {110,110,200,2000} Передайте значения продаж {20,100,50,3} Передайте значения элементов {"TV", "Видеокарта", "Внешний жесткий диск", " Монитор "}

Метод вычисляет прибыль и помещает элементы (Ключ) и прибыль (Значение) в TreeMap. И TreeMap выглядит следующим образом.

Ключ: Монитор, Значение: 3000

Ключ: внешний жесткий диск, значение: 2500

Ключ: ТВ, Значение: 200

TreeMap и HashMap размещают комбинацию ключ / значение пары таким же образом. Есть ли лучший способ использовать inorder TreeMap, чтобы узнать ключ, связанный с максимальным значением, так как он работает так же, как HashMap в этом отношении.

Заранее спасибо.

Ответы на вопрос(2)

Вы, кажется, спрашиваете, если используетеTreeMap вместоHashMap даст вам более простой способ найти ключ, соответствующий наибольшему значению /

Ответ на это ... к сожалению ... Нет.

 nikthecamel31 июл. 2016 г., 16:26
Да, это был мой вопрос. Я хотел бы узнать, используя древовидную карту по-другому для вышеупомянутого сценария, ключ к наибольшему значению получен.

Хитрость в том, что вы можете найти максимальное значение вместе с его ключом, предоставив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());
    });
 Federico Peralta Schaffner31 июл. 2016 г., 23:19
Вы могли бы использоватьMap.Entry.comparingByValue() вместоComparator.comparing(entry -> entry.getValue())

Ваш ответ на вопрос