0

我在制作将返回数组列表的不同整数的方法时遇到问题。我真的很想删除重复项,然后只显示数组列表。我无法弄清楚是什么问题。当我测试它时,这是我得到的输出: [3, 11, 33, 10]

这是我的代码

package getUniques;

import java.util.ArrayList;

public class Uniques {

    public static ArrayList<Integer> getUniques( ArrayList<Integer> list ){
        int i = 0;
        while(i < list.size() - 1){

            for (int j = 0; j < list.size(); j++){

                if (list.get(i) == list.get(j))
                    list.remove(i);
            }
            i++;
        }

        return list;
    }

    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(3);
        list.add(3);
        list.add(5);
        list.add(11);
        list.add(22);
        list.add(33);
        list.add(22);
        list.add(10);
        System.out.println(getUniques(list));
    }

}
4

4 回答 4

2

您还可以使用Set获取唯一值。在 a 中插入值,Set然后将其放回ArrayListlikenew ArrayList(theSet);

于 2013-06-21T00:15:51.957 回答
1

在迭代时更改列表总是会导致痛苦!假设您删除了第 3 项(因此旧的第 4 项变为新的第 3 项) - 然后您执行 i++,因此您实际上跳过了“旧的第 4 项”元素。

i++如果您删除了该项目以回到正轨,您可以跳过,但还有其他一些解决方案:

  1. 首先使用 Set 或类似的东西,这样你就不会得到重复。

  2. 使用第二个列表来保存要删除的项目的值(或索引)(如果使用索引,您可以将它们从最高到最低删除,否则您最终会遇到同样的问题:删除索引 1,索引 4 现在是索引 3。 ..)

  3. 翻转你的搜索,让你回到 0,同样的原则适用。您可以删除高索引而不影响低索引。

  4. 使您的外部循环使用迭代器,以便您可以使用删除操作。

于 2013-06-21T00:12:00.660 回答
0

要在迭代时删除项目,您必须使用迭代器,因为它保证了顺序:

Iterator<Integer> iterator = list.iterator();
int i = 0;
List<Integer> listCopy = new ArrayList<Integer>(list);
while(iterator.hasNext()){
    i++;
    Integer value = iterator.next()
    for (int j = i; j < listCopy.size(); j++){
        if (value.equals(listCopy.get(j))) {
            iterator.remove();
        }
    }
}

但是,在这种情况下,由于您需要对同一个列表进行两次迭代,因此这不是最佳解决方案。将所有内容放入排序集中可能会更快,因为 Set 会自行删除重复项。

于 2013-06-21T00:14:14.213 回答
0

您的代码有一些问题。以下是您现有代码的修复:

首先,您要删除错误的索引。您已将元素标识j为重复项;删除它而不是i.

list.remove(j);  // j not i

接下来,您将删除所有相同的元素,并且不会留下“原始”。i要解决此问题,只需测试(并删除)循环中过去的那些。

for (int j = i + 1; j < list.size(); j++){  // Start at i + 1, not 0.

然后,您需要j在删除索引后重试索引,因为其余元素已向后移动 1 个位置。代替

if (list.get(i) == list.get(j))
    list.remove(i);

尝试

if (list.get(i) == list.get(j))
{
    list.remove(j);
    j--;  // Try this j again next loop, once it's incremented again.
}
于 2013-06-21T00:21:35.277 回答