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 Collections 的提交者。

于 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 文档

最好的祝福

于 2012-10-01T20:57:23.353 回答
0

您可以按值排序,然后向后搜索,直到找到一个值,即 != 最后一个。

但我也喜欢你的方法。它具有线性复杂性,即适用于大多数用例。

于 2012-10-01T20:56:19.133 回答