我有一个名字的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重复”
答案 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}