有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java中从数组中删除元素

所以我在高中的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.编写一个方法compact,从数组中删除所有零,保持元素的顺序不变。此函数中的所有局部变量都必须是标量。换句话说,您不可以使用第二个数组来解决问题。 3.不要仅通过打印数组中的非零值来解决问题。compact方法必须从数组中删除所有零


共 (3) 个答案

  1. # 1 楼答案

    另一编辑:

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

    基于这个问题,紧凑逻辑将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
    

    然后,您可以选择返回一个实际收缩的数组副本,或者简单地返回“所谓的收缩”数组,其结尾为0


    让你想一想:

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

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

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

    例如[1,3,5,7,9]

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

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

    并用一些特殊值(例如本例中的-1)替换末端元件:

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

    使用System.arrayCopy()可以轻松完成数组复制


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

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

    1. 如果您确定没有整数。MIN将出现在您的输入中,然后使用我上面提到的方法,并相应地更新输入数组 您可以考虑使用整数[]而不是int [],这样就可以放置null
    2. 这是最“正常”的方法,但根据您的要求,这可能有效,也可能无效。这个问题要求您只使用标量局部变量。这对我来说意味着,如果我不创建另一个变量,我仍然可以返回另一个数组(似乎问题只是试图阻止您在压缩过程中使用另一个数组)。不过,只需遵循我上面提到的,而不是用一些特殊值替换结束位置,只需保留一个局部变量,即数组长度。每当移除元素时(通过将[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);
    }
    
  2. # 2 楼答案

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

    这很像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 + " " );
        }
    }
    }
    

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

  3. # 3 楼答案

    您可以尝试以下操作:因为您无法修改数组的长度,所以可以对其进行排列,以便将所有零放在数组的末尾,并使用值-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