在数组列表中查找重复值并打印重复值

Val*_*lek 8 java arraylist

我有一个名称数组列表,我想查看重复的值(如果存在)并打印该值。问题是我对是否使用 contains 方法感到困惑,下面的代码不起作用。

ArrayList<String> list=new ArrayList();
        list.add("Sagio Mane");
        list.add("Karius");
        list.add("Mo Salah");
        list.add("Firmino");
        list.add("Lovren");
        list.add("Steven Gerrard");
        list.add("Karius");
        list.add("Mo Salah");

    for(int i =0; i < list.size(); i++) {
         if list.contains(list.get(i)) {
             System.out.println(list.get(i)+" is duplicated")
         }
    }
Run Code Online (Sandbox Code Playgroud)

这应该打印“karius is duplicated”

YCF*_*F_L 8

如果您使用的是 Java 8+,您可以使用:

//Get frequencies of each element
Map<String, Long> frequencies = list.stream()
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

//then filter only the inputs which have frequency great than 1
frequencies.entrySet().stream()
        .filter(entry -> entry.getValue() > 1)
        .forEach(entry -> System.out.println(entry.getKey()));
Run Code Online (Sandbox Code Playgroud)

输出

Karius
Mo Salah
Run Code Online (Sandbox Code Playgroud)


Nit*_*sht 5

尝试这个工作代码:

ArrayList<String> list = new ArrayList<String>();
        list.add("Sagio Mane");
        list.add("Karius");
        list.add("Mo Salah");
        list.add("Firmino");
        list.add("Lovren");
        list.add("Steven Gerrard");
        list.add("Karius");
        list.add("Mo Salah");

        Set<String> s = new HashSet<String>();

        for(String name : list) {
            if(s.add(name) == false)
                System.out.println(name + "is duplicated");
        }
Run Code Online (Sandbox Code Playgroud)

输出:

Kariusis duplicated
Mo Salahis duplicated
Run Code Online (Sandbox Code Playgroud)


sti*_*ike 1

如果你想以空间为代价来降低一些时间复杂度O(n),你可以使用Set

Set<String> set = new HashSet<>();
for(int i =0; i < list.size(); i++) {
    if (set.contains(list.get(i))) {
         System.out.println(list.get(i)+" is duplicated");
    } else set.add(list.get(i));
}
Run Code Online (Sandbox Code Playgroud)

  • `Set::add` 返回一个 `boolean` 来指定记录是否被添加。`Set::contains` 不是必需的。 (2认同)