1

こんにちは私は彼らの年齢の人々のリストを持っています、私は30歳以上の人々を見つける必要があります、ハッシュマップで検索する可能性はありますか?(他の年齢層のものも探す必要があるかもしれないので、コードを簡単にするために2つの異なるリストを使用しないことを好むことに注意してください)

つまり、私の目標は、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反復順序は「予測不可能」です(つまり、キーを挿入するよりも、後でキーを反復しようとしたときに決定的な順序で並べ替えた場合、順序は同じではありません)。

LinkedHashMap代わりに使用してください。

于 2012-10-03T11:45:41.713 に答える
0

良い質問です...残念ながら、マップには非常に特殊なキーが必要です。上記のソリューションは、それを行うための唯一の実際の方法です。

または、2つのリストを維持し、30より古いリストを2番目のリストに保存することもできます。

于 2012-10-03T11:45:50.870 に答える
0

並べ替えることはできません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 に答える