の最大値に関連付けられているキーを見つけたいHashMap<Integer,Integer>
。
Javaマップの最大値に関連付けられたキーの検索という質問を見ましたが、を使用する際には特定の制限がありますHashMap
。
どんな助けでもいただければ幸いです。
の最大値に関連付けられているキーを見つけたいHashMap<Integer,Integer>
。
Javaマップの最大値に関連付けられたキーの検索という質問を見ましたが、を使用する際には特定の制限がありますHashMap
。
どんな助けでもいただければ幸いです。
ここでできることは、HashMapを並べ替え、最初または最後のキーを選択して最大値または最小値を取得することです。
public LinkedHashMap<Integer,Integer> sortHashMapByValues(HashMap<Integer,Integer> passedMap) {
List<Integer> mapKeys = new ArrayList<Integer>(passedMap.keySet());
List<Integer> mapValues = new ArrayList<Integer>(passedMap.values());
Collections.sort(mapValues);
Collections.sort(mapKeys);
LinkedHashMap<Integer,Integer> sortedMap =
new LinkedHashMap<Integer,Integer>();
Iterator valueIt = mapValues.iterator();
while (valueIt.hasNext()) {
Object val = valueIt.next();
Iterator keyIt = mapKeys.iterator();
while (keyIt.hasNext()) {
int key = (Integer)keyIt.next();
int comp1 = (Integer)passedMap.get(key);
int comp2 = (Integer)val;
if (comp1 == comp2){
passedMap.remove(key);
mapKeys.remove(key);
sortedMap.put(key,(Integer) val);
break;
}
}
}
return sortedMap;
}
覚えておいてください-それらは同じ値を持つ複数のキーである可能性があります。
マップがタイプであることを確約する限り、マップHashMap
内のすべてのキーと値のペアを反復処理して最大値を探すよりも優れた方法はありません。このようなハッシュテーブルは、ハッシュコードによってキーを検索する際の速度を最大化するために内部的に編成されています。組織は、これらのキーに関連付けられている値に無関心です。
問題を最もよく解決するには、値の転置インデックスが必要です。複数のキーが元のマップで同じ値を保持できるため(全単射ではないと仮定)、転置インデックスは実際にはマルチマップであり、任意の整数キー(元のマップ値であったキーのセットから取得)は次のようになります。任意の数の整数値(元のマップキー)に関連付けられています。
転置インデックスがタイプNavigableMap
で、値タイプが整数のコレクションである場合、このNavigableMap#lastEntry()
メソッドを使用して、最大の整数キーとそれに対応する値のペアを見つけることができます。または、SortedMap
手元にあるだけの場合でも、そのSortedMap#lastKey()
メソッドを使用して問題のキーを見つけることができます。これは、マップが整数の自然順序で、最低から最高に順序付けられていることを前提としています。
Guavaライブラリは、マルチマップタイプのセットを提供します。そのタイプは、そのメソッドでTreeMultimap
タイプのビューを公開します。最初にそれを使ってみることをお勧めします。SortedMap
TreeMultimap#asMap()
特定の入力マップに対してこの答えを1回だけ見つける必要があり、転置インデックス全体をわざわざ構築したくない場合は、次のO(n)ソリューションを試してください。
public static <T extends Number & Comparable<? super T>>
Collection<? extends T> keysForMaxValueIn(Map<? extends T, ? extends T> map) {
final int size = map.size();
switch (size) {
case 0:
return Collections.emptySet();
case 1:
return Collections.singleton(map.keySet().iterator().next());
default:
final T max = Collections.max(map.values());
// We know that there will be no duplicates in the original key set.
final Collection<T> keys = new ArrayList<T>(size);
for (Map.Entry<? extends T, ? extends T> entry : map.entrySet())
if (max.equals(entry.getValue()))
keys.add(entry.getKey());
return keys;
}
}
順序付けがないためHashMap
、おそらく最も単純なソリューションが最適です。キーが1つだけ必要な場合は、それだけです。
Comparator<Map.Entry<Integer, Integer>> comparator =
new Comparator<Map.Entry<Integer, Integer>>() {
public int compare(
Map.Entry<Integer, Integer> e1, Map.Entry<Integer, Integer> e2) {
return e1.getValue().compareTo(e2.getValue());
}
};
return Collections.max(map.entrySet(), comparator).getKey();
最大値に関連付けられたすべてのキーが必要な場合は、少し注意が必要です。あなたはおそらく次のようなことをするでしょう
Integer bestSeenValue = null;
List<Integer> bestKeys = new ArrayList<>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if (bestSeenValue == null || entry.getValue() > bestSeenValue) {
bestSeenValue = entry.getValue();
bestKeys.clear();
}
if (entry.getValue().equals(bestSeenValue)) {
bestKeys.add(entry.getKey());
}
}
このコードは、すべてのキーを最大値で出力します
public class NewClass4 {
public static void main(String[] args)
{
HashMap<Integer,Integer>map=new HashMap<Integer, Integer>();
map.put(1, 50);
map.put(2, 60);
map.put(3, 30);
map.put(4, 60);
map.put(5, 60);
int maxValueInMap=(Collections.max(map.values())); // This will return max value in the Hashmap
for (Entry<Integer, Integer> entry : map.entrySet()) { // Itrate through hashmap
if (entry.getValue()==maxValueInMap) {
System.out.println(entry.getKey()); // Print the key with max value
}
}
}
}