2016-06-22 9 views
1

私はHashMapを持っており、2つの最大値を取りたいと思っています。私は次のコードを使用しました。しかし、HashMapキーが等しい場合、それは正しい値を与えません。だから、正しい値を取る方法は?JavaでHashMapキーが等しい場合、最大値を2つ取る方法

import java.util.LinkedHashMap; 
import java.util.Map; 

public class TakeTwoMaximumAndChange { 
    public static void main(String[] args) { 
     TakeTwoMaximumAndChange ob = new TakeTwoMaximumAndChange(); 
     ob.test(); 
    } 

    public void test() { 
     LinkedHashMap<String, Double> data = new LinkedHashMap<String, Double>(); 
     data.put("a", 2.3); 
     data.put("b", 2.5); 
     data.put("c", 8.3); 
     data.put("d", 3.8); 
     data.put("c", 6.3); 
     data.put("f", 4.4); 

     Map.Entry<String, Double> max1 = null; 
     Map.Entry<String, Double> max2 = null; 

     // searching the first biggest value 
     for (Map.Entry<String, Double> en : data.entrySet()) { 
      if (max1 == null || en.getValue().compareTo(max1.getValue()) > 0) { 
       max1 = en; 
      } 
     } 
     System.out.println(max1); 

     // searching the second biggest value 
     for (Map.Entry<String, Double> en : data.entrySet()) { 
      if (en != max1 
        && (max2 == null || (en.getValue().compareTo(max2.getValue())) > 0)) { 
       max2 = en; 
      } 
     } 
     System.out.println(max2); 
    } 
} 
+4

'Map'は、同じキーに対して重複したマッピングを持つことはできません。 –

+0

ok。お返事ありがとうございます。 – Emalka

+1

しかし、Apacheの例MultiMapには、 – VLef

答えて

0

迅速な答えは

// searching the first and second biggest value at once 
     for (Map.Entry<String, Double> en : data.entrySet()) { 
      if (max1 == null || en.getValue().compareTo(max1.getValue()) > 0) { 
        max2= max1; 
        max1 = en; 

      } 
     } 

でテストした最初のエントリが最大である場合は、これは失敗した(これを指摘してくれてありがとう、@Grayson)

// searching the first and second biggest value at once, corrected 
     for (Map.Entry<String, Double> en : data.entrySet()) { 

      if (max1 == null){ 
        max1 = en; 
      }else if (en.getValue().compareTo(max1.getValue()) > 0) { 
        max2= max1; 
        max1 = en; 

      }else if ((max2 == null) || (en.getValue().compareTo(max2.getValue()) > 0)){ 
        max2 = en; 
      } 
     } 
+1

テストされた最初のエントリがmax。 – Grayson

+0

はい、あなたはそうです(これは「クイックアンサー」の悪い部分です):P私はこのような編集をしようとしています – malarres

+0

返事ありがとうございます。しかし、両方の部分は動作しません。同じキーで同じ問題。 – Emalka

0

あなたの問題ではありませんあなたのアルゴリズムについて。これは、マップが重複したキーを受け入れないためです。

LinkedHashMap<String, Double> data = new LinkedHashMap<String, Double>(); 
data.put("c", 8.3); 
data.put("c", 6.3); // The second value replace the first one in the Map 



注:無関係の問題に、しかし、あなたは、Java 8を使用している場合、あなたは私が思うラムダを使用して検討するかもしれないがはるかに読みやすいです:

Map<String, Double> m = new HashMap<>();   

final Map.Entry<String, Double> max = m.entrySet() 
    .stream() 
    .max((o1, o2) -> o1.getValue().compareTo(o2.getValue())) // find the max 
    .get(); 

final Map.Entry<String, Double> max2 = m.entrySet() 
    .stream() 
    .filter((e) -> !e.getKey().equals(max.getKey())) // remove the first max 
    .max((o1, o2) -> o1.getValue().compareTo(o2.getValue())) 
    .get(); 
+0

お返事ありがとうございます。 'メソッドのentrySet()は型Map.Entryのために定義されていません。' – Emalka

+0

悪いですが、 'Double'の代わりに' Integer'を使用しました。 –

+0

それはダブルのために同じエラーを与えました。 'メソッドentrySet()は型Map.Entryのために定義されていません。' – Emalka

0

I HashMapを使って直接行うことはできませんでした。私はHAshMap値を並べ替え、ArrayListに値を追加し、リストの最後の2つの値を最大2つの値として取りました。

関連する問題