我想从哈希表中找到所有“具有最大值的条目对,我的哈希表就是这样-
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>
,我知道可以通过首先找到最大值的条目,然后在Hashtable中重复查找其他相似的条目来完成。但是我想知道是否有任何优雅/简单的方法可以做到这一点。
任何想法?
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 );
}
您可以使用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的提交者。
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将是包含在地图中找到的最大值的键的列表
这是什么使它成为一个空的Integer列表,以及一个代表找到的最大数量的数字(默认为最低的int值),然后它会遍历地图并检查此家伙是否具有更大的max,清除列表并将他设置为最大最大值,然后如果他是最大最大值,请添加他的密钥
据我所知,最近没有使用哈希表。我将使用HashMap(它也是一个KeyValue-List)。
您可以使用
for (Entry<Integer, Integer> entry : myMap.entrySet()) {
// Your stuff here
}
使用这种方法,您将获得值和键。有关更多信息,请参见Java Doc。
最诚挚的问候
您可以按值排序,然后向后搜索,直到获得!=最后一个值。
但是我也喜欢你的方法。它具有线性复杂性,即在大多数情况下都可以。