Javaのテキストファイルからデータのグリッドを読み取る方法は?
-
28-10-2019 - |
質問
グリッドと言うとき、私は多次元配列を意味します。 2Dゲームを作成しており、データテキストファイルからレベルをロードできるようにしたいので、これが欲しいです。たとえば、この2D配列があるとしましょう level[3][3
]。単純な3x3マップ。また、次のようなテキストファイルもあります。
1 2 3
4 5 6
7 8 9
C ++では、単にできます:
for (x=0; i<map_width; x++)
{
for (y=0; y<map_height; y++)
{
fscanf(nameoffile, "%d", map[x][y]);
}
}
そして、それはそれに応じてテキストファイルのすべてのコンテンツを配列に入れます。しかし、Javaでこれを行う方法がわかりません。それに応じてデータを配列に配置するだけの種類の同等物はありますか?私はすでにスキャナーのクラスについて知っていますが、それをどのように使用するかわかりません。 Googleを検索しましたが、役に立ちませんでした。それはあまり説明していません。助けてください!具体的には、ファイルをスキャンする方法を知り、アレイ内の適切な場所に読み取るINTを配置する方法を知りたいと思います。
私の現在のコードはこれですが、それはnosuchelementexceptionを投げます:
public void loadMap() {
Scanner sc = null;
try {
sc = new Scanner(inputmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
map[x][y] = sc.nextInt();
}
}
入力マップはファイルです、 map[][]
マップ上の各タイルのデータのグリッドであり、幅と高さはコンストラクターで事前に指定されています。
解決
テキストファイルが実際にフォーマットされる方法に関しては、あなたの質問は非常に役に立ちません。例えば、
123
456
789
とは大きく異なります
1 2 3
4 5 6
7 8 9
さらに、あなたはそれらが常にintであるか、または
1 2 3
4 5 6
a b c
など。これらのテキストファイルに何が入っているかを正確に説明してくれた場合、私たちはあなたをもっと助けることができます。私ができる最善のことは、スキャナーを使用して一般的なものを入力する方法を示すことです。
forループはJavaで似ていますが、スキャナーオブジェクトを初期化する必要があります。
Scanner input = new Scanner(myFile); //whatever file is being read
for (x=0; i<map_width; x++)
{
for (y=0; y<map_height; y++)
{
int nextTile = input.nextInt(); //reads the next int
// or
char nextTile = input.nextChar(); //reads the next char
}
}
それを超えて、私はこれらの入力ファイル内に実際に何があるかについてもっと知る必要があります。
編集:
私はあなたのコードからあなたのループを直接コピーしましたが、あなたは内側と外側をループに交換することをお勧めします。幅が内側のパラメーターであるべきではありません(左から右に読み取ります)?
他のヒント
Javaでは、同様に機能します java.util.Scanner
ファイルのオブジェクトとそれを使用します nextInt
fscanfの代わりにメソッド。
グリッドの寸法がわからない場合
static int[][] readFile(String filename) {
try {
File textfile = new File (GridSearchTest.class.classLoader.getResource(filename).toURI());
Scanner fileScanner = new Scanner(textfile);
int size = Integer.parseInt(fileScanner.next());
String line = fileScanner.nextLine();
int[][] grid = new int [size][size];
int i = 0; int j = 0;
while (fileScanner.hasNextLine()) {
line = fileScanner.nextLine();
System.out.println (line);
Scanner lineScanner = new Scanner(line);
while (lineScanner.hasNext()) {
grid[i][j] = Integer.parseInt(lineScanner.next());
i++;
}
lineScanner.close();
i=0;
j++;
}
fileScanner.close();
return grid;
} catch (IOException e) {
System.out.println("Error reading file: "+ e.getMessage());
System.exit(0);
};
}