删除重复的算法

时间:2015-10-22 17:01:48

标签: java algorithm

所以我创建了一个有一些副本的数组,我创建了一个算法,它会发现重复项并将值更改为0.在我将值更改为0后,它将找到0处的所有值并覆盖它们

   for(out = 0;out < array.length - 1;out++)
       for(in = out+1; in < index;in ++)
           if(array[in] == array[out])
               array[in] = 0;
   for(int n = 0;n < array.length;n++)
       if(array[n] == 0){
           array[n] = array[n + 1];
           n--;

然而它似乎没有运行,当我做一些调整以使其运行时,它不会覆盖元素并减少数组的大小,我做错了什么?

由于

3 个答案:

答案 0 :(得分:2)

您需要大括号({})。如果没有它们,你只会执行下一行,但之后不会执行任何其他操作。

例如:

if(x == y)
    y = 1;
    System.out.println("Not inside if");

只有y = 1会在x == y返回true的结果中执行。 System.out.println("Not inside if")将始终执行,因为它位于if条件语句之外。

如果您希望在x == y时同时运行这两行,则可以执行以下操作:

if(x == y) {
    y = 1;
    System.out.println("Not inside if");
}

答案 1 :(得分:2)

你的算法应该是两遍。首先,将所有重复项标记为零

for(out = 0;out < array.length - 1;out++)
    for(in = out+1; in < index;in ++)
       if(array[in] == array[out])
           array[in] = 0;

然后计算需要在标记位置放置的内容并覆盖它们。

              for(int i = 0;i < array.length;i++)
                    if(array[i] == 0)
                         array[i] = newvalue(i);// array[i + 1];

答案 2 :(得分:0)

因此,您尝试从现有阵列中删除元素。你不能这样做。相反,您必须创建一个新数组,并仅使用您想要保留的元素填充它。

一种光滑的方法是使用ArrayList。这样您就可以一次性删除重复项。

ArrayList<Integer> myList = new ArrayList<>(Arrays.asList(array));
for (int out = 0; out < array.length; out++) {
    for (int in = out + 1; in < array.length; in++) {
        if (array[in] == array[out]) {
            myList.remove(in);
            in--;
        }
    }
}

或者,更多的是原始的纯粹精神:

int newLength = array.length;
for(int out = 0; out < array.length; out++) {
    for(int in = out + 1; in < array.length; in++) {
        if (array[in] == array[out]) {
            array[in] = 0;
            newLength--;
        }
    }
}

int[] newArray = new int[newLength];
int i = 0;
for(int n = 0; n < array.length; n++) {
    if (array[n] != 0) {
        newArray[i] = array[n];
        i++;
    }
}