创建arraylist的hashmap的最佳方法

28 java collections arraylist hashmap data-structures

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

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

你知道我的意思.对于每个用户,它可能会出现多次,或只出现一次(您永远不会知道).我需要找出每个用户的所有值.因为用户可能会随机出现,所以我使用了Hashmap来完成它.即:HashMap(key:String,value:ArrayList).但是要向arrayList添加数据,我必须经常使用HashMap get(key)来获取arrayList,为它添加值,然后将其放回HashMap.我觉得效率不高.有人知道更好的方法吗?

Ste*_*Kuo 65

您无需将ArrayList重新添加回Map.如果ArrayList已经存在,那么只需将值添加到它.

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

Map<String, Collection<String>> map = new HashMap<String, Collection<String>>();
Run Code Online (Sandbox Code Playgroud)

处理每一行时:

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);
Run Code Online (Sandbox Code Playgroud)

20144月的后续行动 - 当我对Google Guava的知识有限时,我在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"));
Run Code Online (Sandbox Code Playgroud)

输出:

[value4, value1]
[value2]
[value3]
Run Code Online (Sandbox Code Playgroud)


Yon*_*oit 12

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

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


ilo*_*una 6

从 Java 8 开始,您可以使用 map.computeIfAbsent

https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#computeIfAbsent-K-java.util.function.Function-

Collection<String> values = map.computeIfAbsent(user, k -> new ArrayList<>());
values.add(value);
Run Code Online (Sandbox Code Playgroud)