1

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

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

样品清单是

element1 40
element2 4
element3 66
element4 5

我想找到值大于 40 和值大于或等于 66 的那些。

4

6 回答 6

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;
    }
}
于 2012-10-03T11:46:55.717 回答
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;
    }
于 2012-10-03T11:56:34.297 回答
0

HashMap迭代顺序是“不可预测的”(也就是说,如果你排序,而不是插入键,当你以后尝试迭代键时,顺序是不一样的)。

改用 a LinkedHashMap

于 2012-10-03T11:45:41.713 回答
0

好问题......不幸的是,地图需要一个非常具体的密钥。您上面的解决方案是唯一真正的方法。

或者,您可以维护两个列表,并将 30 岁以上的列表存储到第二个列表中。

于 2012-10-03T11:45:50.870 回答
0

您不能对 a 进行排序HashMap,它没有顺序。如果您想要订购HashMap,请使用LinkedHashMap.

于 2012-10-03T11:46:24.880 回答
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)

您将拥有一套包含所有必需元素的集合。

于 2012-10-03T11:51:13.577 回答