【问题标题】:How to get 2d array from inputfile looks like field如何从输入文件中获取二维数组看起来像字段
【发布时间】:2019-10-10 16:44:33
【问题描述】:

我想从输入中读取一个文件,这个文件看起来像:

..........
..........
..........
..........

我想要这个输入文件,读取并放入一个二维数组。

我已经试过了:

  public static void main(String[] args) {
    Scanner scanner=new Scanner(System.in);
    System.out.println("Give the input filename");
    String fileName=scanner.nextLine();
    readFieldFile(fileName);

    scanner.close();
  }
  static Cell[][] readFieldFile(String fileName) throws IOException {
    BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
    char[][] field=new char[4][10];
    String currentLine;
    for(int i=0;i<4;i++) {
      while((currentLine=reader.readLine())!=null) {
        field[i]=currentLine.toCharArray();
      }
    }
    return field;
  }

它给出了一个错误,但我认为这是因为我使用了Cell[][]。我需要它来返回这个Cell[][],所以我可以在我的其他函数中使用它。有人知道如何获得正确的回报吗?该字段是固定的:4 行和 10 列。

【问题讨论】:

  • 你遇到了什么错误?
  • 类型不匹配:无法从 char[][] 转换为 Cell[][]
  • 什么是单元格对象?

标签: java file-io


【解决方案1】:

您计算field,一个char[][],但声明您返回一个Cell[][]。创建一个适当大小的Cell[][],并根据需要设置值。然后,您的错误就会消失:

static Cell[][] readFieldFile(String fileName) throws IOException
{
    ... //whatever previous logic
    // don't return, though. Instead, do the following:
    Cell[][] cells = new Cell[4][10];
    for(int i = 0; i < 4; i++)
    {
        for(int j = 0; j < 10; j++)
        {
            cells[i][j] = new Cell(field[i][j]); // or however you initialize Cell
        }
    }
    return cells;
}

或者,您可以通过更改方法声明将返回类型转换为char[][]

static char[][] readFieldFile(String fileName) throws IOException
{
    ... // whatever was there already
}

P.S.:下次请阅读this。标题很好,但问“有人可以帮助我吗?”问题中的任何一点通常都不够精确,无法将您重定向到此链接。

【讨论】:

  • 非常感谢!你回答的有道理。但是在cells[i][j] = new Cell(field[i][j]); 行中,它说“无法实例化单元类型”。你知道如何解决这个问题吗?这个错误意味着什么?
  • 单元格是probably an interface/abstract class,那么。请提供 Cell 的代码(如果已定义)。如果没有定义,你的问题就在那里。
  • 类单元很短:package gameoflife; public enum Cell { DEAD, LIVE }。那么为什么不能实例化呢?我已阅读链接,但找不到答案
  • @mathew 您不能从公共构造函数中实例化枚举。相反,根据字符,将适当的值放入cells。例如,假设 LIVE/DEAD 单元格是 o.,您可以这样做:if(field[i][j] == 'o'){cells[i][j] = Cell.LIVE;}else if(field[i][j]=='.'){cells[i][j] = Cell.DEAD;}else{throw new IllegalStateException("Illegal input! Char is: '"+field[i][j]+"'");}
  • 啊谢谢!!我明白。但它现在如何读取输入文件?还是我必须保留我的while循环?它说reader 现在没有使用
猜你喜欢
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
相关资源
最近更新 更多