【发布时间】:2015-11-06 23:17:58
【问题描述】:
是否有任何类似的数据结构可以存储一个键,并且与HashMap<Key, Value> 不同,它存储了更多关于单个键的值?如果没有,有什么建议吗?因为制作多个具有相同键和不同值的 HashMap 看起来并不那么整洁。
编辑 当我说多个值时,我的意思是不同的值。例如,考虑一张地图,其中每个人都有一个密钥,我们希望存储人的姓名、地址和电话号码。
【问题讨论】:
是否有任何类似的数据结构可以存储一个键,并且与HashMap<Key, Value> 不同,它存储了更多关于单个键的值?如果没有,有什么建议吗?因为制作多个具有相同键和不同值的 HashMap 看起来并不那么整洁。
编辑 当我说多个值时,我的意思是不同的值。例如,考虑一张地图,其中每个人都有一个密钥,我们希望存储人的姓名、地址和电话号码。
【问题讨论】:
根据您的编辑,您可能仍希望为每个键存储一个值,但将值设为对象。例如
public class PersonInfo {
private String name;
private String address;
private String phoneNumber;
etc...
}
并将您的地图定义为HashMap<Key, PersonInfo>
【讨论】:
PersonInfo 应该有一个private List<String> phoneNumbers。 HashMap 不必知道这一点,这是他们拥有零个或多个电话号码的人的属性。
检查Guava's Multimap!它允许您为同一个键有多个值。
Multimap<String, String> multimap = ArrayListMultimap.create();
multimap.put("Fruits", "Banana");
multimap.put("Fruits", "Apple");
multimap.put("Fruits", "Pear");
multimap.put("Vegetables", "Carrot");
// Getting values
Collection<string> fruits = myMultimap.get("Fruits");
Guava 是一个对 Java 程序员非常有用的库,你一定要看看!
在你编辑之后,你真的只需要一个简单的HashMap<Key, Person>。您可以像这样定义Person 类:
public class Person {
private String name;
private String address;
private String phoneNumber;
public Person(String name, String address, String phoneNumber) {
this.name = name;
this.address = address;
this.phoneNumber = phoneNumber;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public String getPhoneNumber() {
return phoneNumber;
}
}
使用您的HashMap<Key, Person>,其中Key 可以是String,例如:
Map<String, Person> personMap = new HashMap<String, Person>();
personMap.put("patrick_key", new Person("Patrick", "1000 Notre-Dame street", "123456789"));
personMap.put("stephan_key", new Person("Stephan", "2000 Notre-Dame street", "987654321"));
那么你可以像这样访问Patrick:
Person person = personMap.get("patrick_key");
【讨论】:
Person 对象?以简单的HashMap<String, Person> 为例。
使用哈希图,每个“值”都是一个列表(根据您的需要链接或双链接)。
【讨论】:
一个简单的解决方案是创建某种形式的 PersonInfo 对象,然后将该值与键字符串一起映射。当您想调用不同的键时,您可以检索包含您希望描述的关于该人的任何值的对象。
如果您希望它们不同,您可以将每个电话号码记录在单独的列表中,并且在用户输入号码时,您可以对照全球号码列表进行检查。 (地址/姓名可以使用两次,因为它们很常见,即认为 Junior 和 Senior 住在同一个家中)
【讨论】: