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

时间:2018-05-27 07:32:18

标签: java arraylist

我有一个名字的Arraylist,我希望看到重复的值(如果存在)并打印此值。问题是我对是否使用包含方法感到困惑,下面的代码无效。

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")
         }
    }

这应该打印“karius重复”

8 个答案:

答案 0 :(得分:3)

如果您使用的是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()));

输出

Karius
Mo Salah

答案 1 :(得分:2)

您可以使用lastIndexOf检查重复项

for(int i =0; i < list.size(); i++) {
  if (list.lastIndexOf(list.get(i)) != i)  {
     System.out.println(list.get(i)+" is duplicated");
  }
}

请注意,如果您有三次或更多次,这将为同一名称多次打印“xxx重复”,但您只需要检查重复项,因此此解决方案应该足够了。

答案 2 :(得分:0)

您可以使用两套。这比性能O(n)更好,因为你必须只循环一次数组,但对内存O(n)不太有效:

public static Set<String> getDuplicates(List<String> list) {
    Set<String> res = new HashSet<>();
    Set<String> existed = new HashSet<>();

    list.forEach(str -> {
        if (!existed.add(str))
            res.add(str);
    });

    return res;
}

另一种选择是使用流:

public static Set<String> getDuplicates(List<String> list) {
    return list.stream().filter(i -> Collections.frequency(list, i) > 1).collect(Collectors.toSet());
}

答案 3 :(得分:0)

如果您希望以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);
}

答案 4 :(得分:0)

List<String> newList = new ArrayList();

Java 8:

oldList.forEach( {

    if (newList.contains(e)) {
        Sytem.out.println(e+" is duplicated");
    } else {
        newList.add(e);
    }
});

Java 7:您可以使用自定义for循环从oldList获取每个。

答案 5 :(得分:0)

您可以按照Find the duplicate elements in arraylist and display

进行操作
 public static void main(String[] args) {
    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");

    HashMap<String, Integer> map = new LinkedHashMap<>(); // If you want insertion order same

    list.forEach((string) -> {
        if (map.containsKey(string)) {
            map.put(string, map.get(string) + 1);
        } else {
            map.put(string, 1);
        }
    });
    for (Map.Entry<String, Integer> entry : map.entrySet()) {
        String key = entry.getKey();
        Integer value = entry.getValue();
        if (value > 1) {
            System.out.println(key + " is duplicated");
        }
    }
}

答案 6 :(得分:0)

试试这个有效的代码:

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");
        }

<强>输出:

Kariusis duplicated
Mo Salahis duplicated

答案 7 :(得分:0)

import java.util.ArrayList;

导入 java.util.HashMap;

公共类 CollectionsEx2 {

public static void main(String[] args) {
    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");
    
    HashMap<String,Integer> hm = new HashMap<String,Integer>();
    for(String i: list) {
        if (hm.containsKey(i)) hm.put(i, hm.get(i)+1);
        else hm.put(i, 1);
    }
    System.out.println("HashMap:" + hm);

}

}

O/p: HashMap:{Firmino=1, Sagio Mane=1, Lovren=1, Karius=2, Steven Gerrard=1, Mo Salah=2}

相关问题