如何在HashMap中查找元素

时间:2012-10-03 12:39:29

标签: java search hashmap

  

可能重复:
  not sure if I should search or sort my hashmap

您好我有一个年龄段的人名单,我需要找到30岁以上的人, 是否有可能在hashmap中搜索? (请注意,我可能需要寻找其他年龄段的人,所以为了简化代码,我不想使用两个不同的列表)

简而言之:我的目标是找到一种在HashMap中搜索具有特定值的元素的方法

样本列表是

element1 40
element2 4
element3 66
element4 5

我希望找到值大于40且值大于或等于66的那些。

除了遍历所有值之外还有其他方法吗?

3 个答案:

答案 0 :(得分:2)

HashMap仅提供按键搜索,因此您必须迭代整个集合并过滤您不想要的元素。

你可以为每个循环执行一次:

for (Entry<MyKey,MyValue> e : map.entrySet()) { 
    if (e.getValue() >= 40) { ....} //e.getKey() is an element with the needed value
    if (e.getValue() >= 66) { ... }
}

另一种方法是持有NavigableMap,该值从值映射到与其相关的元素并使用NavigableMap.subMap()(请注意,如果您可能有重写值,NavigableMap的值应该是List

答案 1 :(得分:1)

使用番石榴,您可以执行以下操作

import com.google.common.base.Predicate;
import com.google.common.collect.Maps;

public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("element1", 40);
        map.put("element2", 4);
        map.put("element3", 66);
        map.put("element4", 5);
        Map<String, Integer> filteredMap = Maps.filterValues(map,
                Predicates.equalTo(66));
    }

由于您所需的年龄可能会发生变化,因此可能会有一个用于过滤的AgePredicate

class AgePredicate implements Predicate<Integer> {
    int minAge;

    public AgePredicate(int minAge) {
        super();
        this.minAge = minAge;
    }

    @Override
    public boolean apply(Integer age) {
        return age > minAge;
    }
}

并在您的过滤器中使用它,如下所示

Map<String, Integer> filteredMap = Maps.filterValues(map,new AgePredicate(66));

答案 2 :(得分:0)

你可以像这样迭代键值:

   Iterator<String> it = hm.keySet().iterator();
    while (it.hasNext()){
        String key = it.next();
        if (hm.get(key) >= 40) {
            // do some stuff...
        }
    }