Java删除数组中的冗余项

时间:2018-09-01 03:39:07

标签: java arrays loops redundancy

对于这个特殊的问题,我尝试删除已排序数组中的多余元素,并在数组的 end 处将它们全部替换为0。例如,如果我有一个由int元素组成的数组

1,3,3,4,4,5,6,6,7

我的输出数组应该是

1,3,4,5,6,7,0,0,0

我对这个问题的第一次尝试是创建一个交换器,以便在删除元素后将所有0推到列表的末尾,但是似乎不会将零推到列表的末尾。这是我的代码。

 public void implode(int[] ary) 
    {
        int swapper = -1;

        int[] newARY = new int[ary.length];
        int current = -1;

        for (int i = 0; i < ary.length; i++)
        {
            if (current != ary[i])
            {
            newARY[i] = ary[i];
            current = ary[i];
            }

        }

        for (int i = 0; i < ary.length; i++)
        {
            if (ary[i] == 0)
            {
                if (ary[i + 1] != 0)
                {
                    swapper = ary[i + 1];
                    ary[i] = swapper;
                    ary[i + 1] = 0;
                }

            }

        }

        ary = newARY;
        for (int i = 0; i < newARY.length; i++)
        {
            System.out.print(newARY[i] + " ");
        }

    }

我正在测试的数组是

 int[] aryIn2 = {1, 1, 2, 3, 4, 4, 5, 6};

但是,当输出内爆数组时,我收到了这个。

1 0 2 3 4 0 5 6

有什么我想念的吗?

谢谢。

3 个答案:

答案 0 :(得分:1)

不是您问题的答案,但是使用(如果可能)java流可以缩短您的出路:

int[] arr = {1,3,3,4,4,5,6,6,7};

// distinct
List<Integer> list = Arrays.stream(arr).distinct().boxed().collect(Collectors.toList());

// pad with zero's
while(list.size() < arr.length) {
    list.add(0);
}

// display
System.out.println(list.stream().map(String::valueOf).collect(Collectors.joining(",")));

将输出

1,3,4,5,6,7,0,0,0

答案 1 :(得分:0)

在第一个循环中:

for (int i = 0; i < ary.length; i++) {
    if (current != ary[i]) {
        newARY[i] = ary[i];
        current = ary[i];
    }
}

您将newARY中的元素填充到ary中,并将重复值变成0:

newARY: 1 0 2 3 4 0 5 6

但是,在第二个循环中:

 for (int i = 0; i < ary.length; i++)
    {
        if (ary[i] == 0)
        {
            if (ary[i + 1] != 0)
            {
                swapper = ary[i + 1];
                ary[i] = swapper;
                ary[i + 1] = 0;
            }

        }

    }

您正在修改原始的ary数组。因此newARY不会更新。

但是,如果连续两个以上的0,则将0推到数组末尾的尝试也会失败。而且它很容易受到ArrayOutOfBoundIndexException的影响,因为您尝试读取ary[i+1]而不限制i

将0推到数组末尾的一种简单明了的方法是创建具有非0s元素的新数组并在以后填充0:

int[] result = new int[ary.lenght];
int resultIndex = 0;
for (int i = 0; i < newARY.length; i++) {
    if (newARY[i] != 0) {
        result[resultIndex++] = newAry[i];
    }
}
for (int i = resultIndex; i < newARY.length; i++) {
    result[i] = 0;
}

// Print result array

提示:使用上述策略,您可以简化代码。无需创建立即数组newARY。只需循环遍历原始数组,将唯一元素推入结果数组,然后在左侧的任何位置填充0。

答案 2 :(得分:0)

我观察到的两个代码问题。

1)您的交换器逻辑正在与先前进行修改的阵列不同的阵列上执行交换

2)您需要以冒泡排序的方式拥有此逻辑,即在一个循环中循环

下面是您的方法的有效修改示例代码。我只修改了第二个for-loop逻辑

public void implode(int[] ary) {
    int swapper = -1;

    int[] newARY = new int[ary.length];
    int current = -1;

    for (int i = 0; i < ary.length; i++) {
        if (current != ary[i]) {
            newARY[i] = ary[i];
            current = ary[i];
        }

    }

    for (int i = 0; i < newARY.length - 1; i++) {
        if (newARY[i] == 0 && newARY[i + 1] != 0) {
            for (int j = i; (j + 1) < newARY.length; j++) {
                swapper = newARY[j + 1];
                newARY[j] = swapper;
                newARY[j + 1] = 0;
            }
        }
    }

    for (int i = 0; i < newARY.length; i++) {
        System.out.print(newARY[i] + " ");
    }

}