【问题标题】:Java removing zeros from arrayJava从数组中删除零
【发布时间】:2010-11-23 02:17:46
【问题描述】:

我正在尝试编写一个程序,该程序在执行时将通过一个数组并删除 0.0 的所有实例并将数组的大小更改为等于非零元素的数量并将这些元素按之前的顺序放置.即如果n=10且a[j]的内容,j=0到n-1的初始值为

0.0, 1.2, 0.0, 0.0, 0.0, 2.3, 0.0, 9.7, 5.6, 0.0

那么代码执行后的内容应该是

 n=4, a[0]=1.2, a[1]=2.3, a[2]=9.7, and a[3]=5.6.

这是我目前所拥有的:

import java.util.Scanner;
public class hw2
{
   public static void main(String[] args) 
   {
       Scanner scan = new Scanner(System.in);
       final double KEY = 0.0;
       int n = scan.nextInt();
       double[] a = new double[n];
       for(int i=0; i<n; i++)
       {
           a[i] = scan.nextDouble();
       }
       for(int k = 0; k<n; k++)
       {
           if(a[k] == KEY)
           {
               a[k] = a[k+1];
               n--;
           }
           System.out.println(a[k]);
       }
   }
}

只要稍微推动一下正确的方向,我们将不胜感激。

【问题讨论】:

  • cough 考虑 ArrayList cough 虽然在这种情况下,如果它是“0”,您可以简单地不保存该值, 也许。 (也不要增加“使用的数组变量”,除非您添加,这样您就知道有多少包含“非 0”数据或将迭代期间遇到的第一个“0”视为“有用数据的结尾”——数组是使用类型的默认值初始化。)
  • 好吧,它基于是否已经有一个名为 a 的数组具有双值,并且您必须运行一个代码 sn-p 它将遍历已填充的数组并删除 0.0 的所有实例,同时保持其他数字按相同顺序排列。

标签: java arrays loops


【解决方案1】:

考虑使用ArrayList,它允许您在需要时添加项目、根据需要增长并保持准确的计数。

尽管在这种情况下,如果您想要/需要使用数组,那么如果它是“0”,您可能根本无法保存该值。 (也不要增加“使用的数组变量”,除非您添加,这样您就知道有多少包含“非 0”数据或将迭代期间遇到的第一个“0”视为“有用数据的结尾”——数组是使用类型的默认值初始化。)

如果你想从一个有零的数组转到一个完全没有零的数组,你必须使用两次——一次计算非零,构造一个适当大小的新数组,然后复制非零值结束。这也可以反向完成(压缩初始数组,然后复制它的“填充”部分),但稍微复杂一些。

如果您确实继续当前的方法(结果数组将有零,但在最后),您需要维护 两个 索引指针 - 一个是主循环迭代器,第二个是下一个放置非零值的位置,它仅在复制值时递增(或不移动,因为两个索引相同,直到第一个0 遇到)。确保将您移动非零的位置“归零”。如果不需要保留顺序,则可以减少移动次数

【讨论】:

    【解决方案2】:

    您的实现(第二个 for 循环)不正确,它将无法通过简单的测试用例: 输入 > 5 2.0 2 0.0 3 0.0 您的程序将有错误的输出: 2.0 2.0 3.0 3.0

    但应该是 2.0 2.0 3

    另外,您不能使用 == 来比较两个双精度数。

    以下代码是我基于您当前代码的解决方案:

        public class hw21 {
        public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
            final double KEY = 0.0;
            final Double ACCEPTABLE_TOLERANCE = 0.000000000001d;
    
            int n = scan.nextInt();
            double[] a = new double[n];
            for (int i = 0; i < n; i++) {
                a[i] = scan.nextDouble();
            }
            for (int k = 0, j = 0; k < n; k++) {
                if (Math.abs(a[k] - KEY) < ACCEPTABLE_TOLERANCE) {
                    continue;
                }
                a[j] = a[k];
                System.out.println(a[j]);
                j++;
            }
        }
    }
    

    我更喜欢使用如下的 ArrayList:

    public class hw2 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        final double KEY = 0.0;
        final Double ACCEPTABLE_TOLERANCE = 0.000000000001d;
    
        int n = scan.nextInt();
        double[] a = new double[n];
        for (int i = 0; i < n; i++) {
            a[i] = scan.nextDouble();
        }
    
        List<Double> newList = new ArrayList<Double>();
        for (int k = 0; k < n; k++) {
            if (Math.abs(a[k] - KEY) < ACCEPTABLE_TOLERANCE) {
                continue;
            }
            newList.add(a[k]);
        }
    
        System.out.println("There are " + newList.size() + " no-zero double:");
            System.out.println(newList);
        }
    }
    

    【讨论】:

      【解决方案3】:
      import java.util.Arrays;
      import java.util.Scanner;
      
      public class StackOverflow1
      {
          public static final double KEY = 0.0;
          private static final Scanner INPUT = new Scanner(System.in);
      
          public static void main(String[] args) {
      
      
             int length = INPUT.nextInt();
             double[] array = new double[length];
      
             for(int i=0; i<length; i++) {
                 array[i] = INPUT.nextDouble();
             }
      
             int index = 0;
             for(int k = 0; k < length ; k++) {
                 if(array[k] == KEY) {
                     continue;
                 }
                 array[index] = array[k]; // bring the non-zeroth element forward
                 if (index != k) array[k] = 0; //make the non-zeroth element zero in the actual location
                 index++;
             }
             System.out.println("n = " + index + " array = " + Arrays.toString(array));
         }
      }
      

      【讨论】:

      • 我希望这会有所帮助。如果您需要进一步的帮助,请发表评论。如果要缩小数组,则需要创建一个新数组并将该数组的元素复制到新数组中。或者你应该使用链表这样的数据结构,这样问题就容易解决了
      • 最好不要从一开始就将那些不需要的零放入数组
      • 希望你明白我说的。您不能缩小数组。您需要将它的元素移动到另一个数组。否则使用链表
      【解决方案4】:

      您可以按如下方式删除那些不需要的零,但在这种情况下它会被排序。

      @org.junit.Test
      public void test15() throws Exception {
          double[] arr = new double[]{0.0,1.1,0.1,0.0,2.1};
          double[] nonZeroArr = arr;
      
          Arrays.sort(nonZeroArr);
          int index = -1;
          while((index = Arrays.binarySearch(nonZeroArr, 0.0)) > -1){
              double[] newArr = new double[nonZeroArr.length-index-1];
              System.arraycopy(nonZeroArr, index+1, newArr, 0, newArr.length);
              nonZeroArr = newArr;
          }
          for (double d : arr) {
              System.out.print(d +",");
          }
          System.out.println();
          for (double d : nonZeroArr) {
              System.out.print(d + ",");
          }
      }
      

      【讨论】:

        【解决方案5】:

        如果您想在课堂上听起来很聪明,请指出这是在许多比 Java 更高效的语言中的一种方法:)

        【讨论】:

          猜你喜欢
          • 2019-02-14
          • 1970-01-01
          • 2010-11-26
          • 1970-01-01
          • 2015-02-22
          • 2021-07-14
          • 2014-04-01
          • 2022-12-05
          相关资源
          最近更新 更多