合并列表中的重复项
我有一些字符串的列表。我需要合并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
此外,我需要排序这个新的列表,但我想我可以只使用集合, 要做到这一点。
public static Map<String, Long> getValuesWithNumberOfOccurrences(
List<String> list) {
return list.stream()
.collect(
Collectors.groupingBy(i -> i, HashMap::new,
Collectors.counting()));
}
您可以在代码中添加一点解释? –
是的,如果可以的话 –
使用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));
}
我假设输出订单需要尊重这是首次遇到的按键顺序。幸运的是,聪明的Java bods为此设计了一个对象: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
。
我需要合并重复项并添加重复计数器。
当想到重复的东西时,想起Set
来隔离。当您尝试添加要设置的元素并且add
方法返回false
时,用2计数打印数据。
但是当条目可能出现两次以上时,则需要对每个条目的计数进行跟踪,直到最后。因此,使用地图来代替每个字符串作为关键字并将其计数作为值。这基本上意味着,当添加一个字符串映射:
从地图得到它
- 如果不为空,然后得到它的值,增量1并再次设置它的值。
- 如果为空,则将其添加到值为1的地图
最后,您可以迭代并查找计数。
在这里很挑剔,但输出是否需要按照特定的顺序,或者是否允许按字母顺序排列(甚至是任意的)? – Bathsheba
你还尝试过什么?为什么你还没有尝试过任何东西? – f1sh
理想情况下,它应按升序排序,但我知道如何去做。 –