2

ハッシュテーブルからすべての「最大値を持つエントリペア」を見つけたいのですが、私のハッシュテーブルは次のようなものです -

    Hashtable<Integer, Integer> ht = new Hashtable<Integer, Integer>();
    ht.put(1, 4);
    ht.put(2, 2);
    ht.put(3, 4);
    ht.put(4, 2);
    ht.put(5, 4);

これらのキーと値のペアを見つけたい: <1,4>, <3,4>, <5,4>、最初に最大値のエントリを見つけてから、ハッシュテーブルを繰り返して他の同様のエントリを見つけることで実行できることを理解しています。しかし、これを行うためのエレガントで簡単な方法があるかどうか疑問に思っていました。

何か案が ?

4

5 に答える 5

2
    int max = Integer.MIN_VALUE;
    final List< Entry< Integer, Integer > > maxList =
            new ArrayList< Entry< Integer, Integer > >();

    for ( final Entry< Integer, Integer > entry : ht.entrySet() ) {
        if ( max < entry.getValue() ) { 
            max = entry.getValue();
            maxList.clear();
        }
        if ( max == entry.getValue() )
            maxList.add( entry );
    }
于 2012-10-01T21:03:41.143 に答える
2

これは、 Eclipse Collectionsのいくつかの反復パターンを使用して実現できます。

MutableMap<Integer, Integer> map = UnifiedMap.newWithKeysValues(1, 4)
    .withKeyValue(2, 2)
    .withKeyValue(3, 4)
    .withKeyValue(4, 2)
    .withKeyValue(5, 4);

Integer maxValue = map.valuesView().max();
RichIterable<Pair<Integer,Integer>> pairs =
    map.keyValuesView().select(
        Predicates.attributeEqual(Functions.<Integer>secondOfPair(), maxValue));

Assert.assertEquals(
    HashBag.newBagWith(Tuples.pair(1, 4), Tuples.pair(3, 4), Tuples.pair(5, 4)),
    pairs.toBag());

各ペアのキーだけが必要な場合は、それらを収集できます。

RichIterable<Integer> maxKeys = pairs.collect(Functions.<Integer>firstOfPair());

注: 私は Eclipse コレクションのコミッターです。

于 2012-10-01T21:59:36.717 に答える
1
List<Integer> keysForMaximums = new ArrayList<Integer>();
int currentMax = Integer.MIN_VALUE;
while(iterator.hasNext()) {
    int key = /*get key from iterator*/;
    int val = /*get value from iterator*/;
    if(val > currentMax) {
        currentMax = val;
        keysForMaximums.clear();
    }
    if(val == currentMax)
        keysForMaximums.add(key);
}

次に、keysForMaximum は、マップで見つかった最大値を含むキーのリストになります

これは、整数の空のリストと、見つかった最大数を表す数値 (デフォルトは最小の int 値) を作成し、マップを調べて、この人がより大きな最大値を持っているかどうかを確認し、リストをクリアして彼を設定します。最大の最大値まで、彼が最大の最大値である場合は、彼のキーを追加します

于 2012-10-01T20:52:45.150 に答える
1

私の知る限り、ハッシュテーブルは最近使用されていません。
私は HashMap を使用します (これは KeyValue-List でもあります)。

完全なマップを反復処理できます

for (Entry<Integer, Integer> entry : myMap.entrySet()) {  
    //  Your stuff here  
}

このメソッドを使用すると、値とキーを取得できます。
詳細については、Java Docを参照してください。

よろしくお願いします

于 2012-10-01T20:57:23.353 に答える
0

値で並べ替えてから、!= 最後の値になるまで逆方向に検索できます。

しかし、私はあなたのアプローチも好きです。線形の複雑さです。つまり、ほとんどのユースケースで問題ありません。

于 2012-10-01T20:56:19.133 に答える