合并列表中的重复项

时间:2016-04-05 15:23:11

标签: java list

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

此外,我需要对这个新列表进行排序,但我认为我可以使用集合来实现这一目标。

4 个答案:

答案 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)不存在,您可以依赖nullkey的事实。这消除了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

最后,你可以迭代并找到计数。