【问题标题】:Clearing and array and filling it with zeros清除和排列并用零填充
【发布时间】:2020-11-02 23:47:03
【问题描述】:

我正在创建一个名为 MySize 的双精度数组,用于保存用户输入。

如何通过使用 if 语句将数组全部填充为零来清除数组?

我尝试创建一个名为 ClearMySize 的函数,以允许用户清除他们创建的整个数组并将其填充为零

package trashmysize;

import java.util.Arrays;
import java.util.Scanner;

public class TrashMySize {

    static double [][] MySize;   
    static int b1 = 0;
    static int b2 = 0;
    static Scanner scanSize = new Scanner(System.in); 
    static int columns = 0;
    static int rows = 0;
    static int NumberOfElements;
    
    static void PrintMySize(){       

        for (int r = 0; r < rows; r++) {
            for (int c = 0; c < columns; c++) {
                System.out.print(MySize[r][c] + " ");
            }
            System.out.println();
        }
}
    
    static void BuildMySize(){
        
        System.out.println("Enter the number of columns: ");
        rows = Integer.parseInt(scanSize.nextLine());
        System.out.println("Enter the number of rows: ");
        columns = Integer.parseInt(scanSize.nextLine());       
        MySize = new double[rows][columns];
        
        
        for (int r = 0; r < rows; r++) {
            for (int c = 0; c < columns; c++) {
                System.out.print(MySize[r][c] + " ");
            }
            System.out.println();
        }
        Menu();
}
    
    static void UserEntryMySize(){

        int blue = 0;
        double value = 0;
        
        
        while(blue < 1){
            System.out.println("Enter value:  ");
            value = Double.parseDouble(scanSize.nextLine());
            System.out.println("What row:   ");
            b1 = Integer.parseInt(scanSize.nextLine()) -1;
            System.out.println("What column: ");
            b2 = Integer.parseInt(scanSize.nextLine()) -1;
            
            try{
                if(b1 <= rows-1 && b2 <= columns-1){
                    System.out.println("Good position");
                }
                blue++;
            }
            catch(Exception e){
                System.out.println(e.getMessage());
                System.out.println("Not a good position");  
                blue++;
                BuildMySize();        
            }
        }
        
        
        MySize[b1][b2] = value;
        PrintMySize();
        Menu();
}           
    
    static void ClearMySize(){
                      
        if(MySize != null){
            //for (int i = 0; i < MySize.length; i++) 
                //MySize[i] = 0;
            
            Arrays.fill(MySize, 0);
        } else {
            System.out.println("Array is empty");
        }
        
        System.out.println("\nArray has been cleared: " + Arrays.toString(MySize));
        PrintMySize();
        Menu();
    
    }
    
    static public  void Menu(){
    
    int choice = 0;
        
        Scanner myScan = new Scanner(System.in);
        System.out.println("\nMain Menu\n"
                + "\n1. Build MySize"
                + "\n2. Add to MySize"
                + "\n3. Clear MySize"
                + "\nMake a choice: ");
        
        choice = Integer.parseInt(myScan.nextLine());
        
        switch(choice){
            case 1 -> BuildMySize();
            case 2 -> UserEntryMySize();
            case 3 -> ClearMySize();
            case 4 -> Menu();
            case 5 -> {
                System.out.println("Thank you for playing! Have a good day!");
                System.exit(0);
            }
        }
    }
    public static void main(String[] args) {
        Menu();
    }
    
}


但这不起作用。它似乎使我的代码崩溃。 我不断收到以下错误消息:

Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer
    at java.base/java.util.Arrays.fill(Arrays.java:3429)
    at trashmysize.TrashMySize.ClearMySize(TrashMySize.java:107)
    at trashmysize.TrashMySize.Menu(TrashMySize.java:136)
    at trashmysize.TrashMySize.UserEntryMySize(TrashMySize.java:91)
    at trashmysize.TrashMySize.Menu(TrashMySize.java:135)
    at trashmysize.TrashMySize.BuildMySize(TrashMySize.java:51)
    at trashmysize.TrashMySize.Menu(TrashMySize.java:134)
    at trashmysize.TrashMySize.main(TrashMySize.java:145)
C:\Users\Amanda\Documents\NetBeansProjects\trashMySize\nbproject\build-impl.xml:1330: The following error occurred while executing this line:
C:\Users\Amanda\Documents\NetBeansProjects\trashMySize\nbproject\build-impl.xml:936: Java returned: 1
BUILD FAILED (total time: 15 seconds)

除了我的清晰功能之外,一切都按原样工作。

【问题讨论】:

  • 什么是MySize,一个数组或数组的大小?
  • “它不起作用。它似乎让我的代码崩溃了。” – 那么,你得到了什么错误信息?
  • MySize 是数组的名称。我正在尝试设置一个名为 ClearMySize 的函数,该函数将清除用户输入到数组中的数据。 clear 函数必须在 if 语句中。

标签: java arrays if-statement


【解决方案1】:

嗯,最简单的解决方案是:

if(condition)
{
   for(int i=0; i<array.length; i++)
   {
      array[i] = 0
   }
}

这就是你要找的吗?

【讨论】:

    【解决方案2】:

    遍历所有索引并将值设置为 0。

    if(array != null){
        for(int i=0;i<array.length;i++) array[i] = 0;
    }
    

    【讨论】:

      【解决方案3】:

      好的,所以这比其他答案所意识到的要复杂。

      首先要注意的是,这不是一个简单的数组。数组声明为:

        static double [][] MySize;   
      

      那是一个数组数组。

      (说真的,这是您为数组变量名称所做的糟糕选择。它与变量的含义无关,并且启动时违反了主要的 Java 风格.)

      你尝试这样填充它:

        Arrays.fill(MySize, 0); 
      

      所以现在我们查看Arrays.fill 的重载,我们看到有三个可能相关的重载:

       Arrays.fill(int[], int);       #1 
      
       Arrays.fill(double[], double); #2
      
       Arrays.fill(Object[], Object); #3
      

      第一个不适用,因为double[][]int[] 不兼容(尽管第二个参数完全匹配)。

      第二个不适用,因为double[][]double[] 不兼容。 (第二个参数通过原始扩展转换兼容。)

      第三个确实适用,因为double[][] ISObject[] 兼容,因为double[]Object 的子类型。但是,要使其“起作用”,您作为第二个参数提供的Object 必须是double[]。它不是。这是一个int。 Java 正在执行装箱转换,将其转换为 Integer ...'因为 JLS 说它应该这样做。

      因此,fill 将尝试将 Integer 分配到数组 double[] 的单元格中......这会引发异常。

      第一课。小心 Java 中的多维数组类型。它们并不完全直观。

      第 2 课。仅将Array.fill(...) 用于一维数组。


      这里的实际解决方案是这样的:

      for (double[] d: MySize) {
          Arrays.fill(d, 0.0);
      }
      

      或者您可以使用嵌套的for 循环并手动填充。

      【讨论】:

      • 谢谢。我知道,这个项目中的所有变量都不是很好,但我们没有选择名称。这确实有效,但必须在 if 语句中呈现。
      • 我稍微修改了一下,让它工作得足以交作业!!非常感谢!
      猜你喜欢
      • 2021-08-07
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      相关资源
      最近更新 更多