您好我有一个年龄段的人名单,我需要找到30岁以上的人, 是否有可能在hashmap中搜索? (请注意,我可能需要寻找其他年龄段的人,所以为了简化代码,我不想使用两个不同的列表)
简而言之:我的目标是找到一种在HashMap中搜索具有特定值的元素的方法
样本列表是
element1 40
element2 4
element3 66
element4 5
我希望找到值大于40且值大于或等于66的那些。
答案 0 :(得分:2)
我建议您使用NavigableMap(实现为TreeSet)。
如果你基于列表实现索引,这个实现非常快--O(log(N)),而O(N)。
编辑。例如:
class PersonsAgeIndex {
private NavigableMap<Integer, List<Person>> ageToPersons =
new TreeMap<Integer, List<Person>>();
public void addPerson( Person p ) {
List<Person> personsWithSameAge = this.ageToPersons.get( p.age );
if ( personsWithSameAge == null ) {
personsWithSameAge = new LinkedList<Person>();
this.ageToPersons.put( p.age, personsWithSameAge );
}
personsWithSameAge.add( p );
}
public List<Person> personsWithAgeLessThan( int age ) {
List<Person> persons = new LinkedList<Person>();
// persons with less age
for (List<Person> tmp : this.ageToPersons.headMap( age ).values()) {
persons.addAll( tmp );
}
return persons;
}
public List<Person> personsWithAgeInInterval( int minAge, int maxAge ) {
List<Person> persons = new LinkedList<Person>();
// persons with age, which: (minAge <= age <= maxAge)
for (List<Person> tmp : this.ageToPersons.subMap( minAge, true, maxAge, true ).values()) {
persons.addAll( tmp );
}
return persons;
}
}
class Person {
public final int age;
public Person(int age) {
this.age = age;
}
}
答案 1 :(得分:1)
试试这个:
private List<Person> getPeople(Map<?, Person> peopleMap, int filterAge) {
List<Person> returnList = new ArrayList<Person>(peopleMap.values().size());
for (Person p : peopleMap.values()) {
if (p.getAge() > filterAge)
returnList.add(p);
}
return returnList;
}
答案 2 :(得分:0)
HashMap
迭代顺序是“不可预测的”(也就是说,如果你按照确定的顺序排序,而不是插入键,当你稍后尝试迭代键时,顺序是不一样的。)< / p>
改为使用LinkedHashMap
。
答案 3 :(得分:0)
好问题......遗憾的是,地图需要一个非常具体的密钥。上面的解决方案是唯一真正的方法。
或者,您可以维护两个列表,并将那些超过30的列表存储到第二个列表中。
答案 4 :(得分:0)
您无法对HashMap
进行排序,也没有订单。如果您需要订购的HashMap
,请使用LinkedHashMap
。
答案 5 :(得分:0)
HashMap<String,String> hmap = new HashMap<String,String>();
SortedSet<String> keys = new TreeSet<String>(hmap.keySet());
这将为您提供一个排序集,您可以将其作为子集。
keys.subSet(from,to),例如keys.subSet(30,100)
你将拥有一套包含所有必需元素的套装。