2016-07-31 31 views
2

Ich habe den folgenden Code geschrieben, um den Schlüssel (String), der den maximalen Wert (Integer) mit TreeMap in JAVA hat.Bekommen Schlüssel mit entsprechenden maximalen Wert in einer Karte (TreeMap/HashMap)

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

Die Methode maxprofitItem ruft die folgenden Parameter als Argumente ab.

belasten die Kosten Werte {100,120,150,1000} Preise Pass Werte {110,110,200,2000} Pass die Verkaufswerte {20,100,50,3} die Elemente Pass Werte { "TV",“ Grafikkarte, externe Festplatte, Monitor

Die Methode berechnet die Gewinne und legt die Elemente (Schlüssel) und Gewinne (Value) in TreeMap.Und die TreeMap sieht wie folgt aus.

Key: Monitor, Wert: 3000

Key: Externe Festplatte, Wert: 2500

Key: TV, Wert: 200

TreeMap und HashMap legt die Schlüssel/Wert-Paar-Kombination in die gleiche Art und Weise. Gibt es eine bessere Möglichkeit, TreeMap zu verwenden, um den Schlüssel zu ermitteln, der mit dem Maximalwert verknüpft ist, da er in dieser Hinsicht wie HashMap funktioniert.

Vielen Dank im Voraus.

Antwort

1

Sie scheinen bei Verwendung von TreeMap statt HashMap zu fragen, werden Sie einen einfacheren Weg geben den Schlüssel entsprechend dem größten Wert/

Die Antwort darauf zu finden ist ... leider ... Nr

+0

Ja, das war mein question.I unter Verwendung treemap anders für das oben beschriebene Szenario wissen wollte, ist der Schlüssel zu dem größten Wert erhalten. – nikthecamel

2

Der Trick ist, dass Sie den maximalen Wert zusammen mit seinem Schlüssel finden können, indem Sie Comparator, die Einträge nach Wert vergleicht.

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

Oder mit neuen 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

Sie könnten 'Map.Entry.comparingByValue()' anstelle von 'Comparator.comparing (entry -> entry.getValue())' verwenden –