繁体   English   中英

使用泛型删除ArrayList中的重复项

[英]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;
}

有人提出了您是连续重复还是非连续重复的问题。 实际上,解决方案的差异很小:

  1. 对于连续重复,上下文是最近看到的项目。
  2. 对于非连续的,它是到目前为止所有项目的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM