gpt4 book ai didi

Java : Best performance-wise method to find an object stored in hashMap

转载 作者:搜寻专家 更新时间:2023-11-01 02:00:43 24 4
gpt4 key购买 nike

我有一堆对象存储在 hashMap<Long,Person> 中我需要在不知道其 ID 的情况下找到具有特定属性的人员对象。

例如人类:

public person{
long id;
String firstName;
String lastName;
String userName;
String password;
String address;
..
(around 7-10 attributes in total)
}

假设我想找到用户名为“mike”的对象。有没有什么方法可以找到它而无需像这样在整个 HashMap 上实际迭代:

for (Map.Entry<Long,Person> entry : map.entrySet()) {
if(entry.getValue().getUserName().equalsIgnoreCase("mike"));

我在这里找到的答案很旧。

最佳答案

如果您想要速度并且一直在寻找一个特定的属性,那么最好的办法是创建另一个以该属性为键的“缓存” HashMap 。

对于少于一百万的条目,占用的内存将是微不足道的,并且 HashMap 查找将比任何其他解决方案快得多。

或者,您可以将所有搜索属性放入一个映射中(即名称和 ID)。如果您担心碰撞,请在键前加上一些独特的东西。像这样的东西:

String ID_PREFIX = "^!^ID^!^";
String USERNAME_PREFIX = "^!^USERNAME^!^";
String FIRSTNAME_PREFIX = "^!^FIRSTNAME^!^";
Map<String,Person> personMap = new HashMap<String,Person>();

//add a person
void addPersonToMap(Person person)
{
personMap.put(ID_PREFIX+person.id, person);
personMap.put(USERNAME_PREFIX+person.username, person);
personMap.put(FIRSTNAME_PREFIX+person.firstname, person);
}

//search person
Person findPersonByID(long id)
{
return personMap.get(ID_PREFIX+id);
}

Person findPersonByUsername(String username)
{
return personMap.get(USERNAME_PREFIX+username);
}

//or a more generic version:
//Person foundPerson = findPersonByAttribute(FIRSTNAME_PREFIX, "mike");
Person findPersonByAttribute(String attr, String attr_value)
{
return personMap.get(attr+attr_value);
}

以上假定每个属性在所有人物中都是唯一的。这对于 ID 和用户名可能是正确的,但问题指定 firstname=mike 这不太可能是唯一的。

在那种情况下你想用一个列表来抽象,所以它更像这样:

Map<String,List<Person>> personMap = new HashMap<String,List<Person>>();

//add a person
void addPersonToMap(Person person)
{
insertPersonIntoMap(ID_PREFIX+person.id, person);
insertPersonIntoMap(USERNAME_PREFIX+person.username, person);
insertPersonIntoMap(FIRSTNAME_PREFIX+person.firstname, person);
}

//note that List contains no duplicates, so can be called multiple times for the same person.
void insertPersonIntoMap(String key, Person person)
{
List<Person> personsList = personMap.get(key);
if(personsList==null)
personsList = new ArrayList<Person>();
personsList.add(person);
personMap.put(key,personsList);
}

//we know id is unique, so we can just get the only person in the list
Person findPersonByID(long id)
{
List<Person> personList = personMap.get(ID_PREFIX+id);
if(personList!=null)
return personList.get(0);

return null;
}

//get list of persons with firstname
List<Person> findPersonsByFirstName(String firstname)
{
return personMap.get(FIRSTNAME_PREFIX+firstname);
}

到那时,您就真正进入了抓包设计,但如果您不期望有数百万个条目,那么它仍然非常高效。

关于Java : Best performance-wise method to find an object stored in hashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48324803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com