web-dev-qa-db-ja.com

HashSet / HashMapで最大数を見つけますjava

HashSetとHashMapで最大の数を見つけたいです。 HashSetに番号[22,6763,32,42,33]があり、現在のHashSetで最大の番号を見つけたいとします。これを行うにはどうすればよいですか。 HashMapでも同様です。あなたがそれを手伝ってくれることを願っています。ありがとうございました。

22
user2064467

Collections.max(Collection) を使用して、コレクションから最大の要素を見つけることができます。同様に、 HashMap の場合、 keySet() または values() 、最大キーまたは最大値のどちらが必要かによって異なります。

また、必要に応じて、代わりに TreeSet および TreeMap を使用して、ソートされたキーの順序で要素を保存できます。

66
Rohit Jain

試してみる

    int max = Collections.max(set);
    int maxKey = Collections.max(map.keySet());
    int maxValue Collections.max(map.values());
9

HashSet/HashMapを使用せざるを得ない場合は、最大値を見つけるためにHashSet/HashMap全体をスキャンする必要があります。 Collections.max()のようなライブラリ関数はこのようにします。

O(1)最大値を取得し、使用中のコレクションのタイプを変更できる場合は、ソートされたセット/マップを使用します(例:TreeSet/TreeMap) 。

6
gd1

このようなもの:

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;
    }
}
2
duffymo

TreeMapの場合、キー/値がランダムに挿入されていることがわかっている場合、ツリーのバランスは多少調整されます。ツリーは不均衡になり、データが既にソートされた順序で挿入されると、特定の要素をすばやく検索(または挿入または削除)する機能が失われます。不均衡なツリーの場合、n、O(n) else O(1))に比例して時間がかかります。

0
Satish

以下は、あなたが求めていることを行う簡単な方法です。

  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;
}
0
ctu

Apache Commons Math の使用を検討してください。 APIドキュメント です。
関心のあるクラスは SummaryStatistics です。 doublesで動作し、最大値、最小値、平均値などを即座に計算します(値を追加すると)。データ値はメモリに保存されないため、このクラスを使用して非常に大きなデータストリームの統計を計算できます。

0
naXa

:マップから最大値を検索する場合は、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();
}