嗨我有一個與他們的年齡的人列表,我需要找到那些超過30歲, 有沒有可能在散列表中搜索? (請注意,我可能需要尋找其他年齡段的人羣,所以爲了簡化代碼,我不想使用兩個不同的列表)不知道是否應該搜索或排序我的散列圖
總之:我的目標是找到一種方法搜索在HashMap中具有特定值的元素
樣品名單
element1 40
element2 4
element3 66
element4 5
我要大於或等於找到那些擁有超過40值以及那些值66
嗨我有一個與他們的年齡的人列表,我需要找到那些超過30歲, 有沒有可能在散列表中搜索? (請注意,我可能需要尋找其他年齡段的人羣,所以爲了簡化代碼,我不想使用兩個不同的列表)不知道是否應該搜索或排序我的散列圖
總之:我的目標是找到一種方法搜索在HashMap中具有特定值的元素
樣品名單
element1 40
element2 4
element3 66
element4 5
我要大於或等於找到那些擁有超過40值以及那些值66
我建議你使用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迭代次序是'不可預測的'(也就是說,如果你排序,而不是按照確定的順序插入關鍵字,當你稍後嘗試迭代關鍵字時,順序是不一樣的)。
改爲使用LinkedHashMap
。
很好的問題......不幸的是,一張地圖需要一個非常具體的關鍵。上述解決方案是唯一真正的解決方法。
或者,您可以維護兩個列表,並將那些年齡大於30歲的列表存儲到第二個列表中。
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人不可能有相同的年齡。 – assylias
試試這個:
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;
}
使用的TreeList。 – SLaks
你使用的是ArrayList還是HashMap?你想搜索,選擇還是排序? 「它不起作用」是什麼意思? –
你是什麼意思「不起作用」?你顯示的代碼應該可以工作。 –