我有一些字符串列表。我需要合并dublicates并添加重复的计数器。例如:
list1.add("Mom");
list1.add("Mom");
list1.add("Son");
list1.add("Son");
list1.add("Dad");
list1.add("Dad");
合并并添加计数器
并且输出需要像这样:
Mom 2
Son 2
Dad 2
此外,我需要对这个新列表进行排序,但我认为我可以使用集合来实现这一目标。
答案 0 :(得分:5)
public static Map<String, Long> getValuesWithNumberOfOccurrences(
List<String> list) {
return list.stream()
.collect(
Collectors.groupingBy(i -> i, HashMap::new,
Collectors.counting()));
}
答案 1 :(得分:1)
使用HashMap
保留重复项:
HashMap<String, Integer> map = new HashMap<>();
for (int i = 0; i < list.size(); i++) {
String text = list.get(i);
if(map.get(text) == null) {
map.put(text, 1);
} else {
map.put(text, map.get(text) + 1);
}
}
for (String text : map.keySet()) {
System.out.println(text + " " + map.get(text));
}
答案 2 :(得分:1)
我假设输出顺序需要遵守首次遇到密钥的顺序。幸运的是,聪明的Java人员为此设计了一个对象:java.util.LinkedHashMap
。
使用
设置存储对象 java.util.Map<String, Integer> map = new java.util.LinkedHashMap<>()
请注意花式钻石符号。
然后,以name
作为字符串,编写类似
if (map.containsKey(name)){
map.put(key, map.get(key) + 1);
} else {
map.put(key, 1);
}
可以稍微优化一下:如果map.get(key)
不存在,您可以依赖null
为key
的事实。这消除了containsKey
电话的需要。
最后,要输出您的值,请使用
行for (java.util.Map.Entry<String, Integer> entry : map.entrySet()){
/*ToDo - use entry.getKey() and entry.getValue()*/
}
如果您希望输出按键排序,请改用java.util.TreeMap
。如果输出顺序对您没有影响,请使用java.util.HashMap
。
答案 3 :(得分:-1)
我需要合并重复项并添加重复项计数器。
当想到重复的东西时,请考虑Set
来隔离。当您尝试添加要设置的元素并且add
方法返回false
时,请以2计数打印数据。
但是当条目可以发生两次以上时,您需要跟踪每个条目的计数直到最后。因此,使用映射代替每个String作为键,将其计数作为值。这基本上意味着,在向地图添加字符串时:
从地图上获取它 - 如果不为null,则获取其值,递增1并再次设置其值 - 如果为null,则将其添加到map = value <1
最后,你可以迭代并找到计数。