2012-10-03 31 views
1

嗨我有一個與他們的年齡的人列表,我需要找到那些超過30歲, 有沒有可能在散列表中搜索? (請注意,我可能需要尋找其他年齡段的人羣,所以爲了簡化代碼,我不想使用兩個不同的列表)不知道是否應該搜索或排序我的散列圖

總之:我的目標是找到一種方法搜索在HashMap中具有特定值的元素

樣品名單

element1 40 
element2 4 
element3 66 
element4 5 

我要大於或等於找到那些擁有超過40值以及那些值66

+2

使用的TreeList。 – SLaks

+5

你使用的是ArrayList還是HashMap?你想搜索,選擇還是排序? 「它不起作用」是什麼意思? –

+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; 
    } 
} 
+0

如何?關鍵是什麼? – assylias

+0

@assylias,看看我的編輯 – stemm

+0

@stemm,謝謝你的回答,但我建議不要使用不同的列表,因爲我有一些其他的要求,我不應該在兩個不同的列表中,例如我可能需要那些在這種情況下超過10個,我需要爲這些項目提供另一個列表。 –

0

0迭代次序是'不可預測的'(也就是說,如果你排序,而不是按照確定的順序插入關鍵字,當你稍後嘗試迭代關鍵字時,順序是不一樣的)。

改爲使用LinkedHashMap

0

很好的問題......不幸的是,一張地圖需要一個非常具體的關鍵。上述解決方案是唯一真正的解決方法。

或者,您可以維護兩個列表,並將那些年齡大於30歲的列表存儲到第二個列表中。

0

您無法排序HashMap,它沒有順序。如果您想訂購HashMap,請使用LinkedHashMap

+0

關於downvote的評論?看起來像一些幼稚的rager,是不是,opc0de;) – m0skit0

+1

我沒有downvote,但你的回答有幫助嗎?只有將地圖實現從hashmap更改爲linkedhashmap才能解決問題。 – assylias

+0

是的,因爲他可以在評論問題時對其進行分類。不是我同意這種方法,但它會工作:) – m0skit0

0
HashMap<String,String> hmap = new HashMap<String,String>(); 
SortedSet<String> keys = new TreeSet<String>(hmap.keySet()); 

這會給你一個有序集合,你可以做的一個子集。

keys.subSet(從,到)e.g keys.subSet(30100)

,你將有一組與所有需要elemets。

+2

在你的場景中,2人不可能有相同的年齡。 – assylias

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; 
    } 
相關問題