不确定我是否应该搜索或排序我的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 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)

你将拥有一套所有必需的元素。