请注意,应该尊重列表成员的hashCode-equals合同,以使过滤正常工作.
然后我们可以通过多种方式删除重复的元素.
deDupStringList3 = stringList.parallelStream().map(String :: toLowerCase).distinct().collect(Collectors.toList());`应该工作.
5> Benno Richte..:
如果您不想要重复,请使用Set而不是a List
.要将a转换List
为a,Set
您可以使用以下代码:
// list is some List of Strings
Set s = new HashSet(list);
如果真的有必要,你可以使用相同的结构将一个Set
回转换成一个List
.
6> Nenad Bulato..:
你也可以这样做,并保持秩序:
// delete duplicates (if any) from 'myArrayList'
myArrayList = new ArrayList(new LinkedHashSet(myArrayList));
7> 小智..:
这是一种不影响列表排序的方法:
ArrayList l1 = new ArrayList();
ArrayList l2 = new ArrayList();
Iterator iterator = l1.iterator();
while (iterator.hasNext()) {
YourClass o = (YourClass) iterator.next();
if(!l2.contains(o)) l2.add(o);
}
l1是原始列表,l2是没有重复项目的列表(确保YourClass根据你想要的平等对应的方法)
与在线性时间内运行的链接哈希集实现相比,此实现在二次时间内运行.(即,在包含10个元素的列表中,这需要长10倍,在包含10,000个元素的列表上需要长10,000倍.[ArrayList.contains]的JDK 6实现(http://grepcode.com/file/repository.grepcode.com/ java/root/jdk/openjdk/6-b27/java/util/ArrayList.java #ArrayList.indexOf%28java.lang.Object%29),JDK8 impl是相同的.)
8> 小智..:
Java 8流提供了一种从列表中删除重复元素的非常简单的方法.使用不同的方法.如果我们有一个城市列表,并且我们想从该列表中删除重复项,则可以在一行中完成 -
List cityList = new ArrayList<>();
cityList.add("Delhi");
cityList.add("Mumbai");
cityList.add("Bangalore");
cityList.add("Chennai");
cityList.add("Kolkata");
cityList.add("Mumbai");
cityList = cityList.stream().distinct().collect(Collectors.toList());
如何从arraylist中删除重复的元素
9> Timofey Gors..:
还有ImmutableSet
从番石榴作为一个选项(这里是文档):
ImmutableSet.copyOf(list);
10> CarlJohn..:
可以在不使用HashSet或一个 arraylist的情况下从arraylist中删除重复项.
试试这个代码..
ArrayList lst = new ArrayList();
lst.add("ABC");
lst.add("ABC");
lst.add("ABCD");
lst.add("ABCD");
lst.add("ABCE");
System.out.println("Duplicates List "+lst);
Object[] st = lst.toArray();
for (Object s : st) {
if (lst.indexOf(s) != lst.lastIndexOf(s)) {
lst.remove(lst.lastIndexOf(s));
}
}
System.out.println("Distinct List "+lst);
输出是
Duplicates List [ABC, ABC, ABCD, ABCD, ABCE]
Distinct List [ABC, ABCD, ABCE]
你是对的,它不是你迭代数组而不是列表.然而,它像地狱一样缓慢.尝试使用几百万个元素.将它与`ImmutableSet.copyOf(lst).toList()`进行比较.
11> 小智..:
这可以解决问题:
private List clearListFromDuplicateFirstName(List list1) {
Map cleanMap = new LinkedHashMap();
for (int i = 0; i < list1.size(); i++) {
cleanMap.put(list1.get(i).getFirstName(), list1.get(i));
}
List list = new ArrayList(cleanMap.values());
return list;
}
12> volley..:
可能有点矫枉过正,但我喜欢这种孤立的问题.:)
此代码使用临时Set(用于唯一性检查),但直接删除原始列表中的元素.由于ArrayList中的元素移除会导致大量的数组复制,因此避免了remove(int)方法.
public static void removeDuplicates(ArrayList list) {
int size = list.size();
int out = 0;
{
final Set encountered = new HashSet();
for (int in = 0; in < size; in++) {
final T t = list.get(in);
final boolean first = encountered.add(t);
if (first) {
list.set(out++, t);
}
}
}
while (out < size) {
list.remove(--size);
}
}
虽然我们在这里,但这里是LinkedList的一个版本(好多了!):
public static void removeDuplicates(LinkedList list) {
final Set encountered = new HashSet();
for (Iterator iter = list.iterator(); iter.hasNext(); ) {
final T t = iter.next();
final boolean first = encountered.add(t);
if (!first) {
iter.remove();
}
}
}
使用标记界面为List提供统一的解决方案:
public static void removeDuplicates(List list) {
if (list instanceof RandomAccess) {
// use first version here
} else {
// use other version here
}
}
编辑:我想泛型的东西在这里并没有真正增加任何价值..哦,好吧.:)
13> 小智..:
public static void main(String[] args){
ArrayList