在字符串Arraylist

时间:2016-03-03 17:17:13

标签: java string arraylist hashmap duplicates

有人知道在String ArrayList中查找重复项并打印出重复项的最有效方法吗?

例如,我有一个包含以下内容的ArrayList:

ArrayList<String> carLIST = new ArrayList<String>();
carLIST = {"Car1", "Car2", "Car3", "Car1", "Car2", "Car2"};

基本上列表中的任何内容我不止一次找到重复项(我认为我已经在下面完成)并且还返回一个System.out.println();显示以下内容:

Car1:count = 2

Car2:count = 3

Map<String,Integer> repeatationMap = new HashMap<String,Integer>();
for(String str : carLIST) {
    if (repeatationMap.containsKey(str) {
        repeatationMap.put(str,repeatationMap.get(str) +1);
    }
    else {
         epeatationMap.put(str, 1);
    }

//  if (repeatationMap.get(str) > 1) {
//       System.out.println(repeatationMap.entrySet());
//  }
}

代码注释掉了我认为打印出来的副本但是我真的错了!不知道如何在列表中打印出重复的汽车并显示其数量。

2 个答案:

答案 0 :(得分:3)

完成填充地图后,您可以迭代它并仅打印键大于1的条目:

for (Map.Entry<String, Integer> e : repeatationMap.entrySet()) {
    if (e.getValue() > 1) {
        System.out.println (e.getKey());
    }
}

请注意,顺便说一句,Java 8允许您以相对优雅的方式在单个语句中执行整个计数和减少流程:

List<String> duplicateCars =
    carLIST.stream()
           .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
           .entrySet()
           .stream()
           .filter(e -> e.getValue() > 1)
           .map(Map.Entry::getKey)
           .collect(Collectors.toList());

答案 1 :(得分:0)

注释掉的部分将打印一些不可读的对象描述。而是使用:

System.out.println(repeatationMap.get(str));

另外,为避免多次打印相同的字符串,请创建一个布尔集以跟踪已打印的字符串。这样就可以避免再次遍历地图。

如果要显示重复数量,则无论如何都将被迫进行第二次循环。