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