java—使用扫描仪读取文本文件并将其转换为2d int数组

oyt4ldly  于 2021-06-29  发布在  Java
关注(0)|答案(3)|浏览(343)

我试图创建一个程序,从jfilechooser读取文本文件,然后将其转换为2dint数组。文本文件可能如下所示:
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();
}
jw5wzhpr

jw5wzhpr1#

我是这样做的。

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);
    }
}

数组.txt

000000
000000
001110
011100
000000
qv7cva1a

qv7cva1a2#

如前所述,最好使用整数的2d arraylist来完成这类操作( ArrayList<ArrayList>> )或整数的二维列表接口( List<List<Integer>> ). 这显然是一种方法,因为您不需要读取数据文本文件两次,一次获取文件中实际数据行的数量,另一次检索数据。通过使用像arraylist或list这样的收集机制,您不需要为它们分配大小,它们可以动态增长。但是,如果您仍然致力于利用二维整数数组( 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

然后控制台窗口的输出将是:

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
3duebb1j

3duebb1j3#

而不是试着读每一个 int 一次,您可以将每一行保存到 List<String> . 然后遍历这个列表,得到每个 char 每个的 String 把它放到你的二维数组里。

相关问题