数组列表中的唯一整数

时间:2013-06-21 00:09:19

标签: java arraylist unique

我在制作一个会返回数组列表的不同整数的方法时遇到问题。我真的想删除重复项,然后只显示数组列表。我无法弄清楚问题是什么。当我测试它时,这是我得到的输出:[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 个答案:

答案 0 :(得分:2)

您还可以使用Set获取唯一值。在Set中插入值,然后将其重新放回ArrayList <{1}},如new ArrayList(theSet);

答案 1 :(得分:1)

迭代时更改列表总是会引起痛苦! 假设你删除第3项(所以旧的第4个成为新的3) - 然后你做我的++,所以你实际上正在跳过“旧的第4”元素。

如果您删除了该项目以重新回到正轨,则可以跳过i++     解决方案:

  1. 首先使用Set或类似设置,这样就无法获得重复项。

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

  3. 翻转您的搜索,以便您回到0,同样的校长 适用。您可以删除高索引而不会影响较低的索引。

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

答案 2 :(得分: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可能会更快,因为Set会自行删除重复项。

答案 3 :(得分: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.
}