[英]Reading a text file with Scanner and turning it into a 2d int array
我正在嘗試創建一個從 JFileChooser 讀取文本文件的程序,然后將其轉換為 2d int 數組。 文本文件可能如下所示:
000000
000000
001110
011100
000000
我需要該文件能夠讀取不確定的行和列的 txt 文件。 這是我嘗試過的代碼,但是當這種情況發生時,我的 GUI 什么都不做,它會中斷並且在關閉時將不再退出。
為了澄清,我希望每個單個數字( 1 或 0 )作為數組的一個元素打印,並且我希望文件的每一行都是數組中的一行。
try {
File file = new File(String.valueOf(fc.getSelectedFile()));
Scanner reader = new Scanner(file);
cols = reader.nextLine().length();
while (reader.hasNextInt()) {
size++;
}
rows = size / cols;
int[][] iBoard = new int[rows][cols];
while (reader.hasNextInt()) {
for (int i = 0; i < iBoard.length; i++) {
for (int j = 0; j < iBoard[0].length; j++) {
iBoard[i][j] = reader.nextInt();
}
}
}
reader.close();
} catch (FileNotFoundException q) {
q.printStackTrace();
}
這是我的做法。
package com.tralamy.stackoverflow;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
public class FileToArray {
public static void main(String[] args) throws IOException {
// In your case, replace "array.txt" by String.valueOf(fc.getSelectedFile())
File file = new File("array.txt"); // Creating a new File for the array
Scanner fileScan = new Scanner(file); // Creating a Scanner Object from the file
ArrayList<ArrayList<Integer>> arrays = new ArrayList<>(); // The 2d Array
// For each line of the file
while (fileScan.hasNextLine()) {
String line = fileScan.nextLine(); // Store the line content to a String variable
ArrayList<Integer> array = new ArrayList<>(); // One dimension Array of Integer
// For each character in the line
for (Character ch : line.toCharArray()) {
/*
* Integer.parseInt parse a String to a integer
* To get a string from a Character I use toString method
* I then add the value to the array*/
array.add(Integer.parseInt(ch.toString()));
}
arrays.add(array); // add the one dimension to the two dimensions array
}
fileScan.close(); // Close the scanner
// To print the result, uncomment the line below
System.out.println(arrays);
}
}
000000
000000
001110
011100
000000
您可以將每一行保存到List<String>
中,而不是嘗試一次讀取每個int
。 然后遍歷這個列表,獲取每個char
的每個String
並將其放入您的二維數組。
正如已經證明的那樣,最好使用 Integer (ArrayList<ArrayList>>) 的 2D ArrayList ( ArrayList<ArrayList>>
) 或 Integer ( List<List<Integer>>
>>) 的 2D 列表接口來完成此類事情。 這顯然是 go 的方式,因為您不需要讀取數據文本文件兩次,一次是為了獲取文件中的實際數據行數,一次是為了檢索數據。 通過使用像ArrayList或List這樣的收集機制,您無需為它們分配大小,它們可以動態增長。 但是,如果您仍然一心想要使用 2D integer 數組( int[][]
),那么您可以將集合轉換為該數組。
這是我對它的看法(利用您提供的代碼方案):
/**
* Allows the User to select a file using a file chooser navigation dialog.
* The selected file contents will then be placed into a 2D int Array. The
* file selected <u>must</u> contain 1 numerical value per text file Line,
* for example: <b>100100010</b>. Any blank lines in the file are ignored.<br>
*
* @param fileLocatedInFolder (Optional - String - Default is: "C:\") The
* directory path for where the JFileChooser lists files in when it opens.
* If nothing is supplied then the JFileChooser will start in the root
* directory of drive C.<br>
*
* @return (Two Dimensional int Array) A 2D int[][] array of the file contents.
* Each file line is an array row. Each numerical value in each file line is
* split into columnar digits for the 2D int array.
*/
public int[][] get2DArrayFromFile(String... fileLocatedInFolder) {
String fileChooserStartPath = "C:\\";
if (fileLocatedInFolder.length > 0) {
if (new File(fileLocatedInFolder[0]).exists() && new File(fileLocatedInFolder[0]).isDirectory()) {
fileChooserStartPath = fileLocatedInFolder[0];
}
}
JFileChooser fc = new JFileChooser(fileChooserStartPath);
fc.showDialog(this, "Open");
if (fc.getSelectedFile() == null) {
return null;
}
String filePath = fc.getSelectedFile().getAbsolutePath();
ArrayList<ArrayList<Integer>> rowsList = new ArrayList<>();
int[][] intArray = null;
// 'Try With Resources' use here to auto-close reader.
ArrayList<Integer> columnsList;
int row = 0;
int col = 0;
try (Scanner reader = new Scanner(fc.getSelectedFile())) {
String fileLine;
while (reader.hasNextLine()) {
fileLine = reader.nextLine();
fileLine = fileLine.trim(); // Trim the line
// If the file line is blank, continue to
// the next file line...
if (fileLine.isEmpty()) {
continue;
}
columnsList = new ArrayList<>();
col = 0;
String[] lineParts = fileLine.split("");
for (int i = 0; i < lineParts.length; i++) {
if (lineParts[i].matches("\\d")) {
columnsList.add(Integer.valueOf(lineParts[i]));
}
else {
System.err.println(new StringBuilder("Ivalid data detected ('")
.append(lineParts[i]).append("') on file line ")
.append((row + 1)).append(" in Column #: ").append((col + 1))
.append(System.lineSeparator()).append("Ignoring this data cell!")
.toString());
}
col++;
}
row++;
rowsList.add(columnsList);
}
}
catch (FileNotFoundException ex) {
Logger.getLogger("get2DArrayFromFile() Method Error!")
.log(Level.SEVERE, null, ex);
}
//Convert 2D Integer ArrayList to 2D int Array
intArray = new int[rowsList.size()][rowsList.get(0).size()];
for (int i = 0; i < rowsList.size(); i++) {
for (int j = 0; j < rowsList.get(i).size(); j++) {
intArray[i][j] = rowsList.get(i).get(j);
}
}
rowsList.clear();
return intArray;
}
並使用上述方法:
int[][] iBoard = get2DArrayFromFile();
// Display 2D Array in Console Window:
if (iBoard != null) {
for (int i = 0; i < iBoard.length; i++) {
System.out.println(Arrays.toString(iBoard[i]).replaceAll("[\\[\\]]", ""));
}
}
如果您的數據文件與您顯示的一樣:
000000
000000
001110
011100
000000
然后 output 到控制台 window 將是:
0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0
0, 0, 1, 1, 1, 0
0, 1, 1, 1, 0, 0
0, 0, 0, 0, 0, 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.