创建数组列表的哈希映射的最佳方法

我有一百万行.txt格式的数据。格式非常简单。对于每一行:

user1,value1
user2,value2
user3,value3
user1,value4
...

你知道我的意思。对于每个用户,它可能出现多次,或者只出现一次(你永远不知道)。我需要找出每个用户的所有值。因为用户可能会随机出现,所以我使用Hashmap来做到这一点。即:HashMap(键:字符串,值:ArrayList)。但是要向arrayList添加数据,我必须不断使用HashMap get(key)来获取arrayList,为其添加价值,然后将其放回HashMap。我觉得它不是那么有效。有人知道更好的方法来做到这一点吗?


答案 1

您无需将 ArrayList 重新添加回 Map。如果 ArrayList 已经存在,那么只需向它添加你的值。

改进的实现可能如下所示:

Map<String, Collection<String>> map = new HashMap<String, Collection<String>>();

处理每行时:

String user = user field from line
String value = value field from line

Collection<String> values = map.get(user);
if (values==null) {
    values = new ArrayList<String>();
    map.put(user, values)
}
values.add(value);

2014年4月的后续工作 - 我在2009年写了最初的答案,当时我对谷歌番石榴的了解有限。鉴于Google Guava所做的一切,我现在建议使用它而不是重新发明它。Multimap

Multimap<String, String> values = HashMultimap.create();
values.put("user1", "value1");
values.put("user2", "value2");
values.put("user3", "value3");
values.put("user1", "value4");

System.out.println(values.get("user1"));
System.out.println(values.get("user2"));
System.out.println(values.get("user3"));

输出:

[value4, value1]
[value2]
[value3]

答案 2

使用 Google Collections 中的 Multimap。它允许同一键的多个值

https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/Multimap.html


推荐