HashSetとHashMapで最大の数を見つけたいです。 HashSetに番号[22,6763,32,42,33]があり、現在のHashSetで最大の番号を見つけたいとします。これを行うにはどうすればよいですか。 HashMapでも同様です。あなたがそれを手伝ってくれることを願っています。ありがとうございました。
試してみる
int max = Collections.max(set);
int maxKey = Collections.max(map.keySet());
int maxValue Collections.max(map.values());
HashSet
/HashMap
を使用せざるを得ない場合は、最大値を見つけるためにHashSet
/HashMap
全体をスキャンする必要があります。 Collections.max()
のようなライブラリ関数はこのようにします。
O(1)
最大値を取得し、使用中のコレクションのタイプを変更できる場合は、ソートされたセット/マップを使用します(例:TreeSet
/TreeMap
) 。
このようなもの:
Set<Integer> values = new HashSet<Integer>() {{
add(22);
add(6763);
add(32);
add(42);
add(33);
}};
int maxValue = Integer.MIN_VALUE;
for (int value : values) {
if (value > maxValue) {
maxValue = value;
}
}
この:
Map<String, Integer> values = new HashMap<String, Integer>() {{
put("0", 22);
put("1", 6763);
put("2", 32);
put("3", 42);
put("4", 33);
}};
int maxValue = Integer.MIN_VALUE;
for (int value : values.values()) {
if (value > maxValue) {
maxValue = value;
}
}
TreeMapの場合、キー/値がランダムに挿入されていることがわかっている場合、ツリーのバランスは多少調整されます。ツリーは不均衡になり、データが既にソートされた順序で挿入されると、特定の要素をすばやく検索(または挿入または削除)する機能が失われます。不均衡なツリーの場合、n、O(n) else O(1))に比例して時間がかかります。
以下は、あなたが求めていることを行う簡単な方法です。
public String getMapKeyWithHighestValue(HashMap<String, Integer> map) {
String keyWithHighestVal = "";
// getting the maximum value in the Hashmap
int maxValueInMap = (Collections.max(map.values()));
//iterate through the map to get the key that corresponds to the maximum value in the Hashmap
for (Map.Entry<String, Integer> entry : map.entrySet()) { // Iterate through hashmap
if (entry.getValue() == maxValueInMap) {
keyWithHighestVal = entry.getKey(); // this is the key which has the max value
}
}
return keyWithHighestVal;
}
Apache Commons Math の使用を検討してください。 APIドキュメント です。
関心のあるクラスは SummaryStatistics です。 double
sで動作し、最大値、最小値、平均値などを即座に計算します(値を追加すると)。データ値はメモリに保存されないため、このクラスを使用して非常に大きなデータストリームの統計を計算できます。
注:マップから最大値を検索する場合は、maxEntry.get()。getKey()ではなくmaxEntry.get()。getValue()を試してください。
1。ストリームの使用
public <K, V extends Comparable<V>> V maxUsingStreamAndLambda(Map<K, V> map) {
Optional<Entry<K, V>> maxEntry = map.entrySet()
.stream()
.max((Entry<K, V> e1, Entry<K, V> e2) -> e1.getValue()
.compareTo(e2.getValue())
);
return maxEntry.get().getKey();
}
2。Collections.max()をラムダ式で使用
public <K, V extends Comparable<V>> V maxUsingCollectionsMaxAndLambda(Map<K, V> map) {
Entry<K, V> maxEntry = Collections.max(map.entrySet(), (Entry<K, V> e1, Entry<K, V> e2) -> e1.getValue()
.compareTo(e2.getValue()));
return maxEntry.getKey();
}
。メソッドリファレンスでストリームを使用する
public <K, V extends Comparable<V>> V maxUsingStreamAndMethodReference(Map<K, V> map) {
Optional<Entry<K, V>> maxEntry = map.entrySet()
.stream()
.max(Comparator.comparing(Map.Entry::getValue));
return maxEntry.get()
.getKey();
}
4。Collections.max()の使用
public <K, V extends Comparable<V>> V maxUsingCollectionsMax(Map<K, V> map) {
Entry<K, V> maxEntry = Collections.max(map.entrySet(), new Comparator<Entry<K, V>>() {
public int compare(Entry<K, V> e1, Entry<K, V> e2) {
return e1.getValue()
.compareTo(e2.getValue());
}
});
return maxEntry.getKey();
}
5。単純な反復の使用
public <K, V extends Comparable<V>> V maxUsingIteration(Map<K, V> map) {
Map.Entry<K, V> maxEntry = null;
for (Map.Entry<K, V> entry : map.entrySet()) {
if (maxEntry == null || entry.getValue()
.compareTo(maxEntry.getValue()) > 0) {
maxEntry = entry;
}
}
return maxEntry.getKey();
}