我有一个
ArrayList<String>
,我想从中删除重复的字符串。如何做到这一点?ArrayList<String>
,我想从中删除重复的字符串。如何做到这一点?如果你不想在集合中出现重复元素,那么你应该考虑为什么要使用允许重复元素的集合。最简单的去重方式是将集合内容添加到一个Set(不允许重复)中,然后再将Set添加回ArrayList中:
Set<String> set = new HashSet<>(yourList);
yourList.clear();
yourList.addAll(set);
当然,这会破坏 ArrayList
中元素的顺序。
虽然将ArrayList
转换为HashSet
可以有效地去除重复项,但如果您需要保留插入顺序,我建议您使用此变体。
// list is some List of Strings
Set<String> s = new LinkedHashSet<>(list);
然后,如果您需要获取 List
引用,可以再次使用转换构造函数。
List<String> deduped = list.stream().distinct().collect(Collectors.toList());
new TreeSet<String>(String.CASE_INSENSITIVE_ORDER)
中。第一个添加的元素将保留在集合中,因此如果您的列表包含“Dog”和“dog”(按照该顺序),则TreeSet
将包含“Dog”。如果必须保留顺序,则在答案行之前放置list.replaceAll(String::toUpperCase);
。 - PaulString
。List<String> strList = new ArrayList<>(5);
// insert up to five items to list.
List<String> deDupStringList = new ArrayList<>(new HashSet<>(strList));
List<String> deDupStringList2 = Lists.newArrayList(Sets.newHashSet(strList));
List<String> deDupStringList3 = strList.stream().distinct().collect(Collectors.toList());
List<String> deDupStringList3 = strList.stream().distinct()
.collect(Collectors.toCollection(LinkedList::new));
parallelStream
,但它并不总是能带来预期的性能优势。请查看question以获取更多信息。List<String> deDupStringList3 = stringList.stream().map(String::toLowerCase).distinct().collect(Collectors.toList());
在这种情况下应该是合适的解决方案。 - DiabloList
。您可以使用以下代码将 List
转换为 Set
:// list is some List of Strings
Set<String> s = new HashSet<String>(list);
如果确实有必要,您可以使用相同的构造方法将 Set
转换为 List
。
Set
。 - TheRealChx101这里有一种方法,不会影响你的列表顺序:
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具有您想要表示相等性的equals方法)
ArrayList<T>
而不是ArrayList
);2)可以通过使用for (T current : l1) { ... }
来避免显式迭代器的创建。即使你想要显式使用一个迭代器,iterador
也拼错了。 - randersJava 8流提供了一种非常简单的方法来从列表中删除重复元素,使用distinct方法。 如果我们有一个城市列表,并且想要从该列表中删除重复项,可以在一行代码中完成 -
List<String> 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());
您也可以这样做,并保留顺序:
// delete duplicates (if any) from 'myArrayList'
myArrayList = new ArrayList<String>(new LinkedHashSet<String>(myArrayList));
这可以解决问题:
private List<SomeClass> clearListFromDuplicateFirstName(List<SomeClass> list1) {
Map<String, SomeClass> cleanMap = new LinkedHashMap<String, SomeClass>();
for (int i = 0; i < list1.size(); i++) {
cleanMap.put(list1.get(i).getFirstName(), list1.get(i));
}
List<SomeClass> list = new ArrayList<SomeClass>(cleanMap.values());
return list;
}
另外还有来自Guava的ImmutableSet
可作为选项(文档在此处):
ImmutableSet.copyOf(list);
ImmutableSet.asList()
方法,返回一个ImmutableList
,如果你需要将其作为List
返回。 - Andy Turner
public Set
- Ondrej BozekList
和Set
来定义变量(而不是像你的例子中使用实现类型ArrayList
和HashSet
)。 - Joniknew HashSet(al)
来清理代码,而不是初始化为空并调用addAll
。 - ashes999