【发布时间】:2011-02-05 05:09:35
【问题描述】:
我有一种情况,我想用一个键和它的值将数据存储在一个对象中。键名相同,但值已更改。我尝试使用哈希映射,但它也不支持这一点。它会覆盖所有值并只给我最近的一对值。
我的问题是:有什么类或方法可以帮助我解决这个问题吗?
【问题讨论】:
-
您想存储多个值绑定到一个键?这当然是可能的。你如何区分哪个是正确的值?
标签: java collections map
我有一种情况,我想用一个键和它的值将数据存储在一个对象中。键名相同,但值已更改。我尝试使用哈希映射,但它也不支持这一点。它会覆盖所有值并只给我最近的一对值。
我的问题是:有什么类或方法可以帮助我解决这个问题吗?
【问题讨论】:
标签: java collections map
使用什么数据结构
如果要求为单个键存储多个值,那么使用multimap 将是一个不错的选择。
这种多映射的一个实现是来自Google Guava 库的Multimap。
Guava 中的Multimap 接口有多种实现,具体取决于键和值的多样性和顺序的要求。
选择实现
一个简单的实现是HashMultimap,其中键映射的值不允许重复,并且键的顺序不是决定性的。
ArrayListMultimap 保留映射到键的值的顺序,按照它们映射到键的顺序。
【讨论】:
如果您需要跟踪多个值,您可以在 Map 中使用 List 值。如果满足您的要求,您可以使用 List 中的最后一个值是最新值的假设。
创建这样的映射可以这样完成(尽管您的键和值类型不必是字符串,它们可以是您使用的任何类):
Map<String, List<String>> map = new HashMap<String, List<String>>();
然后要获取给定键的最新值,您需要获取相应列表的最后一个元素:
List<String> list = map.get(key);
String value = null;
if (list != null) {
value = list.get(list.size() - 1);
}
要向 Map 添加值,如果新键不存在值,则需要添加逻辑以创建新列表,否则将新值添加到列表末尾:
if (map.get(key) == null) {
List<String> list = new ArrayList<String>();
list.add(value);
map.put(key, list);
}
else {
map.get(key).add(value);
}
【讨论】:
put、getLast、getAll等简单接口。