在java中从数组中删除元素

在java中从数组中删除元素,java,arrays,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] 我必须使用数组来执行此操作,不允许创建第二个数组来执行此操作。我在网上和JavaAPI上都找遍了,想找到一个可以从数组中删除元素的方法,但我就是找不到。如果有人有任何想法,我可以使用或指导我的方向,你的建议将不胜感

所以我在高中的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]

我必须使用数组来执行此操作,不允许创建第二个数组来执行此操作。我在网上和JavaAPI上都找遍了,想找到一个可以从数组中删除元素的方法,但我就是找不到。如果有人有任何想法,我可以使用或指导我的方向,你的建议将不胜感激

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

另一个编辑:

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

基于这个问题,紧凑逻辑将0视为“无意义”的东西,需要“删除”。因此,在“收缩”数组之后,我们并不真正需要某种特殊的值。简单地将其保持为0将有所帮助

除了“将[i+1,end]复制到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
并用一些特殊值(例如本例中的-1)替换末端元件:

使用
System.arrayCopy()


我刚刚看到了你问题的最新进展

我的大部分回答仍然有效,以下是关于您的问题的一些额外更新:

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

    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);
    }
    
    int[]压缩(int[]输入){
    int arrSize=input.length;
    int i=0;
    而(i<1){
    如果(输入[i]==0){
    将输入[i+1到结束]复制到输入[i到结束-1]
    棱边尺寸--;
    }否则{
    i++;
    }
    }
    返回数组.copyOf(输入,arrSize);
    }
    
    您可以尝试以下操作:由于无法修改数组的长度,因此可以对其进行排列,以便将所有零放在数组的末尾,并且值
    -1
    (这是可选的,只是为了指示它们是零)

    注意:这符合问题要求:

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

    我通常不喜欢做家庭作业,但我发现这篇文章写得很有趣,也不可能,就这样吧

    这很像Christian的答案,但我使用整数而不是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 + " " );
        }
    }
    }
    
    公共类ArrayCompact{
    私有静态整数[]数组={1,3,5,0,7,9,0,2,0,4,6,0,8,-1,0};
    公共静态void main(字符串[]args){
    打印阵列(紧凑型(阵列));
    }
    公共静态整数[]压缩(整数[]整数){
    int j=0;
    for(int i=0;i

    输出
    1 3 5 7 9 2 4 6 8-1空空
    从技术上讲,我想你不能打印空,因为那不是打印0…

    是否允许使用
    ArrayList
    ?数组的大小在Java中是固定的。如果数组的长度
    4
    ,则无法删除元素并使其长度
    2
    。如果不创建新数组,则无法执行此操作,数组的长度是不可变的。不能缩小或扩大数组。是否确定“标量”表示“非数组”?你确定这是用“Java”写的吗?@user3164008他教Java课已经38年了?你对购买Fl感兴趣吗
    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);
    }
    
    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
    
    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 + " " );
        }
    }
    }