在java中从数组中删除元素

时间:2014-01-29 03:04:36

标签: java arrays

所以我在高中的AP计算机科学课上,所以我不是很有经验。我有一个程序要做,这需要我从文件中读取数字,将这些数字放入一个数组,然后从数组中删除所有的0。

所以如果数字是:0,2,4,6,0,5,3,5 ...... 我需要创建一个数组:[0,2,4,6,0,5,3,5] 然后删除0:[2,4,6,5,3,5]

我必须使用数组执行此操作,并且不允许创建第二个数组来执行此操作。我已经在网上和Java API上查找了一个可以从数组中删除元素的方法,但我找不到一个。如果有人知道我可以使用的一个或指导我的方向,你的建议将不胜感激。

这是对于词的问题: 1.编写一个读取文本文件(compact.txt)的程序,并将整数存储在一个数组中。您的讲师将提供此文本文件。 2.编写一个方法 compact ,删除数组中的所有零,保持元素的顺序不变。此函数中的所有局部变量必须是标量。换句话说,您可能不会使用第二个数组来解决问题。 3.不要仅仅通过打印出数组中的非零值来解决问题。 compact 方法必须从数组中删除所有零。

3 个答案:

答案 0 :(得分:2)

您可以尝试以下操作:由于您无法修改数组的长度,因此您可以对其进行排列,以便将所有零都放在数组的末尾并使用值-1(这是可选的,仅用于指示它们是零。

public static void main(String[] args)
{
    int[] arr = { 0, 1, 2, 0, 3, 0, 4, 0, 5, 6, 7 };
    int[] arrWithoutZeros = compact(arr);
    for (int i : arrWithoutZeros) {
        System.out.println(i);
    }
}

private static int[] compact(int[] arr)
{
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] == 0) {
            int j = 0;
            for (j = i; j < arr.length - 1; j++) {
                arr[j] = arr[j + 1];
            }
            arr[j] = -1;
            i--;
        }

    }
    return arr;
}

<强>输出:

1
2
3
4
5
6
7
-1
-1
-1
-1

注意:这符合问题要求:

  • 保持元素的顺序不变(它改变位置,但不改变顺序)
  • 不要使用第二个数组
  • 仅通过打印非零元素
  • 无法解决
  • 从数组中删除零(它们现在是-1

答案 1 :(得分:2)

我通常不喜欢做作业,但我发现这个有趣而且不可能像写的那样,所以这里有。

这很像Christian的答案,但我使用的是Integer而不是int,因此我可以将0设置为null而不是其他整数。我还避免了额外的循环,他必须在每个0上复制每个剩余的值,而是迭代数组一次,然后只迭代尾部一次以设置空值。

public class ArrayCompact {

private static Integer[] ARRAY = { 1, 3, 5, 0, 7, 9, 0, 2, 0, 4, 6, 0, 8, -1, 0 };

public static void main( String[] args ) {
    printArray( compact(ARRAY ));
}

public static Integer[] compact( Integer[] ints ) {
    int j = 0;
    for ( int i = 0; i < ints.length; i++ ) {
        if ( ints[i] != 0 ) {
            ints[j++] = ints[i];
        }
    }
    for ( int i = j; i < ints.length; i++ ) {
        ints[i] = null;
    }
    return ints;
}

public static void printArray( Integer[] ints ) {
    for ( Integer i : ints ) {
        System.out.print( i + " " );
    }
}
}

输出1 3 5 7 9 2 4 6 8 -1 null null null null null从技术上讲,我猜你可能不会打印空值,因为那不是不打印0 ...

答案 2 :(得分:1)

另一个编辑:

(我认为以前的答案仍然有意义,我将其保留在最后。此编辑主要是针对作业要求的建议)

基于这个问题,紧凑逻辑将0视为“无意义”的东西,需要“删除”。因此,在“缩小”数组之后,我们并不需要某种特殊的值。只需将其保持为0即可。

除了“copy [i + 1,end] to i”方法之外,还有另一种(更简单,可能更快)的方法可以用来“删除”零。

基本上你需要的是,遍历数组。如果遇到0,则在该位置后找到第一个非零值,并将零与该非零值交换。

在psuedo代码中看起来像这样:

for (i = 0; i < arr.length; i++) {
  if (arr[i] == 0) {
    for (j = i+1; j < arr.length; j++) {
       if (arr[j] != 0) {
         arr[i] = arr[j];
         arr[j] = 0;
         break;
       }
    }
  }
}
// arr is "shrinked" here

然后你可以选择返回一个实际缩小的数组副本,或者直接返回“所谓缩小”的数组,最后输入0。


你可以想到的东西:

首先,在Java中,数组的大小是固定的,因此,不可能缩小数组的大小。因此,在不创建新数组的情况下使用较少元素的结果数组是不可能的

如果您可以将未使用的元素作为一些特殊值(例如-ve或0等)保留在最后,则数组中位置i的删除元素实际上意味着:

将数组元素[i + 1到end]复制到位置i,并用特殊的空值替换arr [end]

e.g。 [1,3,5,7,9]

如果我想删除索引2,我需要做的是将元素3-4复制到位置2:

[1,3,5,7,9]   ->  [1,3,7,9,9]
       ^^^             ^^^

并用一些特殊值替换end元素(例如,在本例中为-1):

[1,3,7,9,9] -> [1,3,5,7,-1]

使用System.arrayCopy()

可以轻松完成数组复制

刚刚看到你问题的更新。

我的大多数答案仍然有效,这里有一些关于你的问题的额外更新:

  1. 如果您确定输入中不会出现Integer.MIN,请使用我上面提到的方法,并相应地更新输入数组。
  2. 您可以考虑使用Integer []而不是int [],这样就可以使用null
  3. 这是最“正常”的方法,但根据您的要求,这可能有效,也可能无效。这个问题要求你只有标量局部变量。这对我来说意味着,如果我不创建另一个变量,我仍然可以返回另一个数组(似乎问题只是试图阻止你在压缩过程中使用另一个数组)。然而,按照我上面提到的,不要用一些特殊值替换结束位置,只需保留一个数组长度的局部变量。每当删除一个元素(通过将[i + 1,0]复制到位置i)时,减少数组长度var。最后,使用Arrays.copyOf(oldArray, newLength)返回“缩小”数组的新副本。
  4. 这是第3点的伪代码:

    int[] compact(int[] input) {
      int arrSize = input.length;
    
      int i = 0;
      while (i < arrSize) {
        if (input[i] == 0) {
          copy input[i+1 to end] to input[i to end-1]
          arrSize--;
        } else {
          i++;
        }
      }
      return Arrays.copyOf(input, arrSize);
    }