首页 > 解决方案 > 如何将矩阵中的元素设置为空白“”,而不是默认的“null”

问题描述

我有以下代码,我希望存储用户输入,然后代码循环返回并存储下一个输入,直到他们点击“Q”,然后退出。我不知道该怎么做。另外,我希望我的二维数组在用户设置大小后打印为空白,而不是默认的 0。因此,如果用户说他们想输入 SIZE = 4x4 “行 =1,列 =2,输入 =7”,它将打印“这些零将为空白

0000
0070
0000
0000

输入“第 2 行,第 1 列,输入 A 它将打印

0000
0070
0700
0000

到目前为止我的代码

import java.util.*;

public class MainProg {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        System.out.print("How many rows do you want for your matrix?  ");
        int row = in.nextInt();

        System.out.print("How many columns do you want for your matrix?  ");
        int column = in.nextInt();
        String[][] newArray = new String[row][column];


        Array2 twoDArray = new Array2(row, column, newArray); //calling my class


        do {
            System.out.println("If you would like to set an, element press S: " + "\n" +
                    "If you would like to set an element, press G" + "\n" +
                    "If you would like to empty an element, press E" + "\n" +
                    "If you would like to print an element, press P" + "\n" +
                    "If you would like to quit, press Q");
            String userInput = in.next();


            if (userInput.equalsIgnoreCase("S")) {
                twoDArray.setElement();
            } else if (userInput.equalsIgnoreCase("G")) {
                twoDArray.getElement();
            } else if (userInput.equalsIgnoreCase("E")) {
                twoDArray.clearElement();
            } else if (userInput.equalsIgnoreCase("P")) {
                twoDArray.printMatrix();
                //you will do you toString here
            } else if (userInput.equalsIgnoreCase("Q")) {
                //this will quit the program
                twoDArray.quitProgram();
            }
            //break;
        } while (true);
    }
}
import java.util.*;

public class Array2 {
    MainProg main1 = new MainProg();
    Scanner in = new Scanner(System.in);
    private String [][] newArray;
    private int row;
    private int column;



    public Array2(int row, int column, String[][] newArray) {
        this.row = row;
        this.column = column;
        this.newArray = newArray;
    }

    public void getElement() {
        Scanner in = new Scanner(System.in);
        System.out.println("What row is the element you would like to get in? (Must be under " + row + ")");
        int userRow = in.nextInt();
        System.out.println("What column is the element you like to get in? (Must be under " + column + ")");
        int userCol = in.nextInt();
        System.out.println("You have entered: " + "\n" +
                "Row " + userRow + "\n" +
                "Column " + userCol);
        String getElement = newArray[userRow-1][userCol-1];
        System.out.println(getElement);
    }

    public void setElement() {
        System.out.println("What row would you like your element in? (Must be under " + row + ")");
        int userRow = in.nextInt();
        System.out.println("What column would you like your element in? (Must be under " + column + ")");
        int userCol = in.nextInt();
        System.out.println("What character would you like the element to be?");
        String userChar = in.next();
        System.out.println("You have entered: " + "\n" +
                "Row " + userRow + "\n" +
                "Column " + userCol + "\n" +
                "Char to be entered: " + userChar);
        newArray[userRow][userCol] = String.valueOf(userChar);
    }

    public void clearElement() {
        Scanner in = new Scanner(System.in);
        System.out.println("What row is the element you would like empty? (Must be under " + row + ")");
        int userRow = in.nextInt();
        System.out.println("What column is the element you like to empty? (Must be under " + column + ")");
        int userCol = in.nextInt();
        System.out.println("You have entered: " + "\n" +
                "Row " + userRow + "\n" +
                "Column " + userCol);

    }

    public void printMatrix() {
        Scanner in = new Scanner(System.in);
        //String result = " ";
        System.out.println("The array is: \n");
        for (int i = 0; i < newArray.length; i++) {
            for (int j = 0; j < newArray[i].length; j++) {
                System.out.print(newArray[i][j]);
            }
            //for (String[] row: newArray) THIS LEAD TO A PROBLEM
            //    Arrays.fill(row, " ");
            System.out.println();
        }
    }

    public void quitProgram() {
        System.out.println("The system will now exit! BYE!!!");
        System.exit(0);
    }
}

我已经编辑了我的代码,以便我回答了一些问题。现在我剩下的唯一问题是让我的矩阵最初填充空白“”,而不是默认的“null”。我试图在我的 printMatrix 方法中使用 Arrays.fill,但是这会导致问题,它不会在循环后保存用户输入。

标签: javaarraysmultidimensional-arrayuser-input

解决方案


您的 IndexOutOfBoundsException (现在已被编辑)是由于您使用rowandcolumn而不是 setElement 中的userRowand userColumn,这是您存储用户输入的位置。 row并将column引用类成员变量,它们都是 5,因为您将其设置为 5x5 矩阵,因此高于最大索引 4。您还需要将 char 转换为字符串,因为您使用String[][]

System.out.println("You have entered: " + "\n" +
        "Row " + userRow + "\n" +
        "Column " + userCol + "\n" +
        "Char to be entered: " + userChar);
newArray[row][column] = userChar;

最后一行应该是newArray[userRow][userColumn] = String.valueOf(userChar);. 尽管您可能希望检查这些值是否小于rowcolumn避免更多该异常。

即使解决了这个问题,您的代码目前还有其他问题。最大的问题是您当前正在定义并在大多数方法中使用新数组,而不是成员变量 newArray,因此 get/set/clear/print 的方法调用没有像您期望的那样使用您的实例,而是使用新的空数组每一次。这些应该是操纵this.newArray而不是创造自己的操纵,随着他们的回归而死亡。在研究循环用户输入并与数组交互之前,您需要解决所有这些问题。

在打印 0 时,这是上述问题之一的副作用。在 printMatrix 中,您声明一个新的int[][] newArray并打印它。int 的默认值是 0,所以你得到全 0。如果您使用的是 String 数组,您将获得每一行的所有“nullnullnull..”,因为 String 的默认值为 null。如果您最初想要所有空白,则必须在构造函数中将数组初始化为所有空字符串,或者在循环遍历数组时处理 null 打印空格。

在循环用户输入时,您还需要在 while 之前在循环内再次请求它,否则只会要求用户输入一次,并且您将永远使用该选项循环。

祝你好运,这似乎是熟悉 OO 和数组操作的好方法,但是代码中的许多问题超出了单个 SO 答案的范围,并且有点像课堂作业。我已经修复了您的示例代码,并根据您的需要进行了操作,只需进行少量更改,所以您很接近了。

编辑: 将来,请不要继续编辑问题以反映进一步的发展,除非您将原始问题保留并添加到它并且它仍然反映原始问题的延续,因为它使答案和评论没有上下文。SO 更多的是针对所面临的具体问题提出问题和答案,而不是针对持续发展提供反馈的论坛。如果您通过答案解决了特定问题,请将该答案标记为解决方案并将任何新问题移至新问题中,否则您可能会面临关闭问题的风险。请参阅https://stackoverflow.com/help/asking下的前几个主题,尤其是https://stackoverflow.com/help/how-to-ask,了解我的意思。我很温和,但这个社区不可能总是如此。

话虽如此,由于您似乎在这里做出了真正的努力,这里有一些基于您的评论和编辑的建议。

如果要使用空格预填充行,则

for (String[] row : newArray)
    Arrays.fill(row, " ");

代码块不会打印,因为每次调用 print 时都会将其空白。它应该进入您的构造函数,以便在创建对象时只发生一次。

或者,如果您想在 print 方法中处理它,例如

System.out.print(newArray[i][j] == null ? " " : newArray[i][j]);

可以做到这一点,使用三元运算符在遇到时打印出“”而不是 null。

您也不需要在这些方法中更新扫描仪,但它不会影响功能。


推荐阅读