2016-08-22 29 views
1

Map<String, Integer> とリターンが最低持つMap.Entry<String, Integer> を入力Map.Entry<String, Integer>見つけ、私が行うことになってる何

引数を経由する方法の種類を返すメソッドを持っている最低のマークの付いたエントリを返します整数。

public static Entry<String, Integer> findLowest(Map<String, Integer> map) 
    { 
     int min = 10000; 
     String nm =""; 
     Set<Map.Entry<String, Integer>> ss = map.entrySet(); 
     System.out.println("map entryset"+map.entrySet()); 
     Iterator<Map.Entry<String, Integer>> it = ss.iterator(); 
     Map.Entry<String, Integer> e = null; 
     Map.Entry<String, Integer> ee = e; 
     while(it.hasNext()) 
     { 
      e = it.next(); 
      System.out.println("e.getvalue: "+ e.getValue()); 
      System.out.println("min: "+ min); 
      if(e.getValue() < min) 
      { 
      System.out.println("lower than"); 
      min = e.getValue(); 
      nm = e.getKey(); 

      } 
     } 
     System.out.println(ee); 
     return e; 
    } 
+3

何が問題なのですか? –

+3

をサイドノードとして使用して、最小値が「Integer.MAX_VALUE」に初期化され、値が10000を超えるとバグを作成しないようにします。 – SomeJavaGuy

+0

問題は、メソッドが最低のエントリMap.entry

答えて

2

これを行うための方法がたくさんありますが、私の好みはこれです:あなたは、あなたがエントリのストリームからminメソッドを使用できるJava 8の使用を許可している場合

public static Map.Entry<String, Integer> findLowest(Map<String, Integer> map) { 
    Map.Entry<String, Integer> result = null; 
    if (map != null && !map.isEmpty()) { 
     Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator(); 
     result = it.next(); 
     while (it.hasNext()) { 
      Map.Entry<String, Integer> current = it.next(); 
      if (current.getValue() < result.getValue()) { 
       result = current; 
      } 
     } 
    } 
    return result; 
} 
3

。エントリの値を比較するComparatorを提供するだけです。すでに他の人々からもらった「正しい」直接の回答に加えて

public static Map.Entry<String, Integer> findLowest(Map<String, Integer> map){ 
    return map.entrySet() 
       .stream() 
       .min(Comparator.comparing(Map.Entry::getValue)) 
       .orElse(null); 
} 
+0

Java-8の偉大さ! –

0

、私はあなたのためのさまざまな提案を持っている:「最小」の値を見つけることは、ご使用の環境でより頻繁に発生する操作であれば、データの使用を検討あなたの "頻繁な"問題を解決するのに役立つ構造。

ブルートフォースは、次のようなものです。この関係を把握している「逆」Map<Integer, String>を使用してください。次に、「最小の」キーを見つけるのがはるかに簡単/迅速になるSortedMapを使用して調べることができます。

もちろん、2つのマップ(もちろん同期しておく必要があります)があれば、それは得られたパフォーマンスに見合った価値があります。

0
  HashMap<String, Integer> hm = new HashMap<String, Integer>(); 
      hm.put("second", 2); 
      hm.put("third", 3); 
      hm.put("fourth", 4); 
      hm.put("first", 1); 
      Set<Entry<String, Integer>> set = hm.entrySet(); 
      List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(
        set); 
      Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { 
       public int compare(Map.Entry<String, Integer> o1, 
         Map.Entry<String, Integer> o2) { 
        return o1.getValue().compareTo(o2.getValue()); 
       } 
      }); 

      return list.get(0); //will return lowest value from that entry set 

     }  
関連する問題