[英]Removing duplicates in an ArrayList using Generics
我被要求编写一个小程序,从列表中删除重复项,并创建一个没有重复项的新列表。 我们必须使用Java中的泛型来执行此操作。 这是我到目前为止的内容:
感谢所有帮助!!!
import java.util.ArrayList;
public class Assignment13 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("one");
list.add("two");
list.add("three");
list.add("three");
System.out.println("Prior to removal: " + list);
System.out.println("after: " + list2);
}
public static <E> ArrayList<E> removeDuplicates(ArrayList<E> list) {
ArrayList<E> list2 = new ArrayList<E>();
for (int i = 1; i < list2.size(); i++) {
String a1 = list2.get(i);
String a2 = list2.get(i-1);
if (a1.equals(a2)) {
list2.remove(a1);
}
}
return list2;
}
}
从您的问题看来,似乎无法保证原始列表中的重复元素必须按顺序出现。 这意味着检查两个相邻元素是否相等还不足以删除所有重复项。
如果列表已排序,则检查相邻元素将起作用。 但是由于您需要使用泛型,所以我想您不允许对元素的性质进行假设。 这意味着您无法对列表进行排序,因为您将需要知道元素是Comparable
。
因此,您可以这样做:
1. Create a new empty list
2. For each element in the original list
2.1 If the element is not in the new list, add it
2.2 Else, ignore it
如果允许您使用Java 8,这会容易得多:
static <E> List<E> removeDuplicates(List<E> list) {
return list.stream().distinct().collect(Collectors.toList());
}
这是算法:
public static <E> ArrayList<E> removeDuplicates(ArrayList<E> list) {
ArrayList<E> list2 = new ArrayList<E>();
for (E elem : list)
if (!list2.contains(elem))
list2.add(elem);
return list2;
}
您可以通过循环和条件来实现:
public static <E> ArrayList<E> removeDuplicates(ArrayList<E> list) {
ArrayList<E> list2 = new ArrayList<E>();
for(E item : list) {
if(!list2.contains(item)) {
list2.add(item);
}
}
return list2;
}
使用Set(如果您的作业允许)比检查list.contains包含每个项目更有效。 例如:
public static <E> ArrayList<E> removeDuplicates(ArrayList<E> list) {
Set<E> uniques = new HashSet<E>();
uniques.addAll(list);
return new ArrayList<E>(uniques);
}
这里的一般策略是遍历列表时要保持上下文 ,并且在每个步骤中,您都使用该上下文来回答是否应该保留或丢弃当前项目的问题。 用伪代码:
public static <A> List<A> removeDuplicates(List<? extends A> original) {
List<A> result = new ArrayList<A>();
/* initialize context */
for (A item : original) {
if ( /* context says item is not a duplicate */ ) {
result.add(item);
}
/* update context to incorporate the current `item` */
}
return result;
}
有人提出了您是连续重复还是非连续重复的问题。 实际上,解决方案的差异很小:
Set<A>
。 我让您填写这些情况的模式。
针对您的问题进行了更新
ArrayList<E> list2 = new ArrayList<E>();
for (int i = 1; i < list.size(); i++) {
String a1 = list2.get(i);
if (!list2.contains(a1)) {
list2.add(a1);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.