合并列表中的重复项

问题描述:

我有一些字符串的列表。我需要合并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 

此外,我需要排序这个新的列表,但我想我可以只使用集合, 要做到这一点。

+2

在这里很挑剔,但输出是否需要按照特定的顺序,或者是否允许按字母顺序排列(甚至是任意的)? – Bathsheba

+0

你还尝试过什么?为什么你还没有尝试过任何东西? – f1sh

+0

理想情况下,它应按升序排序,但我知道如何去做。 –

public static Map<String, Long> getValuesWithNumberOfOccurrences(
     List<String> list) { 
    return list.stream() 
       .collect(
        Collectors.groupingBy(i -> i, HashMap::new, 
        Collectors.counting())); 
} 
+0

您可以在代码中添加一点解释? –

+0

是的,如果可以的话 –

使用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的地图

最后,您可以迭代并查找计数。