Java读取字符串到2D布尔数组

时间:2017-03-30 12:11:25

标签: java arrays

我正在尝试读取一个由#和空格组成的txt文件到一个2D布尔数组,所以从技术上讲,#表示true,空格表示false。

在类似帖子的帮助下,我聚集了一个代码,虽然他们正在读取数组的整数。

我的代码是:

public static void main(String[] args) {
    String x;
    String y;
    Scanner fileName = null;
    try {
        fileName = new Scanner(new File("C:/Users/USER/Desktop/hashtag.txt"));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    x = fileName.nextLine();
    y = fileName.nextLine();

    boolean[][] cells = new boolean[x][y];

    String finalX = fileName.nextLine();
    String finalY = fileName.nextLine();
    cells[finalX][finalY] = true;

    for (int i = 0; i < cells.length; i++) {
        for (int j = 0; j < cells[i].length; j++) {
            if (cells[i][j])
                System.out.print("#");
            else
                System.out.print(" ");
        }
        System.out.println();
    }

}

在我编写boolean[][] cells = new boolean[x][y];

的代码中

它说[x][y]需要一个int,但是找到了一个字符串。同样的问题适用于cells[finalX][finalY] = true;

我尝试解析ie Integer.parseInt(x)然而这会让我错误: Exception in thread "main" java.lang.NumberFormatException: For input string: "#####################"

我的问题在什么时候?如果我解析为Int,那么它无法读取#correct?

3 个答案:

答案 0 :(得分:0)

  

它说[x]和[y]需要一个int,但是找到了一个字符串。相同   问题是针对单元格[finalX] [finalY] = true;

     

我尝试解析即Integer.parseInt(x)然而这让我感到厌倦   错误:线程“main”中的异常java.lang.NumberFormatException:For   输入字符串:“#####################”

您可以做的一种方法是先读取整个文件。

示例:

List<String> tempList = new ArrayList<>();

while (fileName.hasNextLine()) {
     String line = fileName.nextLine();
     tempList.add(line);
}

然后你可以这样做:

boolean[][] cells = new boolean[tempList.size()][tempList.get(0).length()];

注意 - 此解决方案假设每行的长度()相同且每行的列相同。

另外,为什么需要在循环外执行此操作?

cells[finalX][finalY] = true;

你应该删除该行并让循环完成所有工作以确定#' '。此外,您的if condition似乎没有做正确的操作。考虑实施这种方法,然后从那里继续。

答案 1 :(得分:0)

我认为这可以解决它:

1-读取文件的每一行,直到它结束,以获得单元格行数n,然后获取任何String行的长度,以获得m的列数。< / p>

2-创建布尔数组cells[n][m]

3-逐行读取文件并将每一行放在String变量中并迭代字符串变量字符,如果字符为#则将true放入单元格数组中,否则放置false。< / p>

      String line="";
      int n=0;
      while(fileName.hasNextLine()){
        line = fileName.nextLine();
        n++;
      }
      int m = line.length();
      boolean[][] cells = new boolean[n][m];
      // initialize Scanner to read file again
      Scanner in = new Scanner(new File("C:/Users/USER/Desktop/hashtag.txt"));
      int i=0;
      while(in.hasNextLine()){
            line = in.nextLine();
        for(int j=0; j < line.length(); j++){
            char c = line.charAt(j);    
            if(c == '#'){
                cells[i][j] = true;
            }
            else{
                cells[i][j] = false;
            }
        }
        i++;
     }

答案 2 :(得分:0)

你在代码中有很多错误,这种方法肯定是错误的,你甚至不能保存你从数组中的文件中读取的值。此代码根本不是你如何做的,用于阅读你不知道你想要使用的文件长度的文件列表你不需要指定列表将要采用的元素数量(它可能用阵列获得半工作解决方案,但没有必要学习一些简单错误的东西。在尝试使用文件之前,你应该学习更基本的东西,你甚至不能正确地初始化你的数组,你使用字符串作为大小和索引导致你提到的那些问题,另一个初学者错误是试图解析非整数字符串到int(您试图将############转换为int,这是不可能的,如果您知道字符串是1或5或1000之类的整数,则只能使用此字符串)。 所以我对你的问题的回答是慢慢地学习基础知识,然后逐步添加新的东西,而不是急着用它。