您好我有一个年龄段的人名单,我需要找到30岁以上的人, 是否有可能在hashmap中搜索? (请注意,我可能需要寻找其他年龄段的人,所以为了简化代码,我不想使用两个不同的列表)
简而言之:我的目标是找到一种在HashMap中搜索具有特定值的元素的方法
样本列表是
element1 40
element2 4
element3 66
element4 5
我希望找到值大于40且值大于或等于66的那些。
除了遍历所有值之外还有其他方法吗?
答案 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...
}
}