2016-07-31 5 views
2

JavaでTreeMapを使用して最大値(Integer)を持つキー(String)を見つけるために、以下のコードを書いています。Map(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"); 
    } 
} 

maxprofitItemメソッドは、引数として以下のパラメータを取得します。

{} 100,120,150,1000 は価格が {} 110,110,200,2000 が {} 20,100,50,3 「は、 { "TV" を値項目を渡し売上値を渡し値渡し値のコストを渡します(Key)とProfit(Value)をTreeMapに格納します。ツリーマップは、以下のようになります。

キー:モニター、値:3000

キー:外部ハードディスク、価値:2500

キー:テレビ、値:200

のTreeMapとHashMapのは、中のキー/値のペアの組み合わせを置きます同じ方法。 TreeMap inorderを使用して、この点に関してHashMapと同じ方法で動作するので、最大値を持つキーを見つけるより良い方法はありますか?

ありがとうございます。

答えて

1

あなたはそれに答えは...残念ながら...第

/ TreeMap代わりの HashMapを使用すると、あなたの最大値に対応する鍵を見つけるための簡単な方法を与えるかどうかを尋ねるように見えます
+0

はいそれは私のquestion.Iは、上記のシナリオごとに異なるツリーマップを使用して知りたいと思った、最大値への鍵が得られます。 – nikthecamel

2

トリックは、値で項目を比較する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()); 
    }); 
+2

'Comparator.comparing(entry - > entry.getValue())'の代わりに 'Map.Entry.comparingByValue()'を使うことができます。 –

関連する問題