嗨,谢谢你的阅读!我目前正在学习Java中的泛型,这正是我想要实现的目标:
我需要从ArrayList中删除重复的元素。目前,ArrayList包含整数。我想首先打印原始列表,然后在删除重复项后打印结果列表。这就是我到目前为止所拥有的。任何帮助表示赞赏!
public static void main(String[] args) {
ArrayList<Integer> list1 = new ArrayList<Integer>();
list1.add(1);
list1.add(1);
list1.add(1);
list1.add(2);
list1.add(2);
list1.add(2);
list1.add(3);
list1.add(3);
list1.add(3);
removeDuplicates(list1);
System.out.println("Original List with Duplicates: \n" + list1);
System.out.println();
//System.out.println("After removing duplicates: \n" + list2);
}
public static <E> ArrayList<E> removeDuplicates(ArrayList<E> list2){
for(int i = 0; i < list2.size(); i++){
//logic to remove duplicates
}
return list2;
}
答案 0 :(得分:2)
您可以将元素添加到Set集合中。如果要保留顺序,则应使用LinkedHashSet
答案 1 :(得分:1)
第一步
将您的列表转换为集合。
Set<Integer> aSet = new HashSet<Integer>(list);
第二步
将您的设置转换回列表。
list = new ArrayList<Integer>(new HashSet<Integer>(list));
为何有效
集合只能包含唯一元素。
答案 2 :(得分:0)
将ArrayList转换为Set,也许是HashSet,然后返回到ArrayList,如果你想按顺序排列数字,你可以对它进行排序(通常不保证Sets中的排序)。
HashSet hs<Integer> = new HashSet(list1);
ArrayList<Integer> uniqueList = Collections.sort(new ArrayList<Integer>(hs));
还有各种SortedSet
,其中包括TreeSet
。
此外,您可以使用不易出错的for
循环结构:
for (int i : uniqueList) {
System.out.println(i);
}
答案 3 :(得分:0)
public static void main(String[] args) {
ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<Integer> list2 = new ArrayList<Integer>();
list1.add(1);
list1.add(1);
list1.add(1);
list1.add(2);
list1.add(2);
list1.add(2);
list1.add(3);
list1.add(3);
list1.add(3);
System.out.println("Original List with Duplicates: \n" + list1);
System.out.println();
list2 = removeDuplicates(list1);
System.out.println("After removing duplicates: \n" + list2);
}
public static <E> ArrayList<E> removeDuplicates(ArrayList<E> list2){
ArrayList<E> usedList = new ArrayList<E>();
ArrayList<E> newList = new ArrayList<E>();
for(int i = 0; i < list2.size(); i++){
E object = list2.get(i);
if(! usedList.contains(object))
{
usedList.add(object);
newList.add(object);
}
}
return newList;
}
输出(如预期):
Original List with Duplicates:
[1, 1, 1, 2, 2, 2, 3, 3, 3]
After removing duplicates:
[1, 2, 3]
如果您正在使用其他类型(不是int
等java标准),那么您必须覆盖equals
方法,因为它在ArrayList
{{1}中使用方法。
答案 4 :(得分:0)
public static <E> ArrayList<E> removeDuplicates(ArrayList<E> list2){
LinkedHashSet<E> dataSet = new LinkedHashSet<E>(list2.size());
dataSet.addAll(list2);
ArrayList<E> uniqueLists = new ArrayList<E>(dataSet.size());
uniqueLists.addAll(dataSet);
return uniqueLists;
}
答案 5 :(得分:0)
到目前为止,所有其他答案都会创建一个新列表。如果要修改列表,可以在使用辅助Set
的同时遍历列表,以跟踪已经看到的所有元素。以下适用于允许删除元素的任何List
(不仅仅是ArrayList
):
public static <E> List<E> removeDuplicates(List<E> list){
ListIterator<E> iter = list.listIterator();
Set<E> seen = new HashSet<>();
while (iter.hasNext()) {
if (!seen.add(iter.next())) {
// element not added--must have already been seen, so remove element
iter.remove();
}
}
return list;
}
另一种方法是将整个列表转储到Set
,清除列表,然后将该组的所有元素添加回列表中。根据{{1}}实施情况,这可能会也可能不会保留订单。
Set
编辑:如果(根据您的评论)您希望完全删除开头不是唯一的元素,您可以修改第一种方法:
public static <E> List<E> removeDuplicates(List<E> list){
Set<E> unique = new LinkedHashSet<>(list);
list.clear();
list.addAll(unique);
return list;
}
请注意,由于我们在循环期间没有修改列表,因此我们不需要显式迭代器。