如何删除索引列表中的重复元素?

时间:2018-09-18 16:24:49

标签: java list duplicates

我有这种方法:

static <E> IndexedList<E> deleteRepeated(IndexedList<E> l)

和用法:

IndexedList<E> list = new ArrayIndexedList<E>();

目前我拥有的代码是这样,但它不起作用

   for (int i = 0; i < l.size(); i++) {
    int repeated = 0;
    if (l.contains(l.get(i))) {
        repeated++;
        if (repeated < 1) {
            list.add(l.get(i));
        }
    }
}
return list;

}

3 个答案:

答案 0 :(得分:1)

虽然可能不是性能最好的解决方案,但我只是创建一个LinkedHashSet来删除重复项(同时保留每个元素的首次出现的原始顺序),然​​后将其转换回{{1 }}:

List

答案 1 :(得分:1)

Java 8: list.stream().distinct().collect(Collectors.toList());

流文档: https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html

答案 2 :(得分:0)

首先要注意的是您的支票:

    if (l.contains(l.get(i)))

将始终返回true,因为您正在检查列表是否具有从该列表中获取的元素。您需要检查新列表是否已包含该元素。并且不需要repeated变量。

下面是简短列表(最多约100个元素)的处理方法:

    for (int i = 0; i < l.size(); i++) {
    if (!list.contains(l.get(i))) {
        list.add(l.get(i));
    }
    return list;

将以上内容用于较大的列表的问题是它会变得非常慢。每次检查元素时,您都在遍历该列表(list.contains在内部执行此操作)。要使其更快,请使用HashSet检查重复项:

    Set<E> uniqueValues = new HashSet<>();
    for (int i = 0; i < l.size(); i++) {
    if (uniqueValues.add(l.get(i))) {
        list.add(l.get(i));
    }
    return list;

顺便说一句,我认为这是算法设计中的一个练习。在现实世界中,我们不会编写这样的代码,而是使用标准Java API提供的现有功能。