Java 删除数组中的冗余项
Java Removing Redundant Items in Array
对于这个特殊问题,我试图删除排序数组中的冗余元素,并在数组的 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
有什么我遗漏的吗?
提前致谢。
在第一个循环中:
for (int i = 0; i < ary.length; i++) {
if (current != ary[i]) {
newARY[i] = ary[i];
current = ary[i];
}
}
你用 ary
中的元素填充 newARY
,重复值变为 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 的影响,因为您尝试在 i
上不受限制地读取 ary[i+1]
将 0 推到数组末尾的一种简单直接的方法是创建包含非 0 元素的新数组,然后再填充 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 填充任何剩余的槽。
我观察到您的代码有两个问题。
1) 您的交换程序逻辑正在与您之前进行修改的数组不同的数组上执行交换
2) 您需要以冒泡排序的方式实现此逻辑,即在循环中循环
下面是您的方法的有效修改示例代码。我只修改了第二个for循环逻辑
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] + " ");
}
}
不是您问题的答案,但使用(如果可能)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
对于这个特殊问题,我试图删除排序数组中的冗余元素,并在数组的 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
有什么我遗漏的吗?
提前致谢。
在第一个循环中:
for (int i = 0; i < ary.length; i++) {
if (current != ary[i]) {
newARY[i] = ary[i];
current = ary[i];
}
}
你用 ary
中的元素填充 newARY
,重复值变为 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 的影响,因为您尝试在 i
ary[i+1]
将 0 推到数组末尾的一种简单直接的方法是创建包含非 0 元素的新数组,然后再填充 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 填充任何剩余的槽。
我观察到您的代码有两个问题。
1) 您的交换程序逻辑正在与您之前进行修改的数组不同的数组上执行交换
2) 您需要以冒泡排序的方式实现此逻辑,即在循环中循环
下面是您的方法的有效修改示例代码。我只修改了第二个for循环逻辑
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] + " ");
}
}
不是您问题的答案,但使用(如果可能)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