将 .txt 文件的内容读入二维字符串 ARRAYLIST

Read the contents of a .txt file into a 2D string ARRAYLIST

希望能帮到你。仍在努力让我的头脑清醒 java!

我有一个文本文件的内容,我想将其存储(并在以后使用)到二维数组列表中。 文本文件示例如下所示(不确定行数上的不确定条目数):

狗、猫、猴子、大象
薯条、香肠、豆子、老鼠、蚂蚁
任何东西,无论如何,一些对象,不知道,每一行都有不同的值

我希望能够按原样打印出文本文件,但其中的项目整齐地存储在我的二维数组列表 (biD) 中
例如:

狗|猫|猴子|大象|
芯片|香肠|豆子|老鼠|蚂蚁|
任何东西|任何东西|一些对象|不知道|每一行都有不同|值的数量|

但是当我 运行 下面的程序时,我得到:

列为 15
狗|猫|猴子|大象|芯片|香肠|豆子|老鼠|蚂蚁|任何东西|随便什么|一些对象|不知道|每一行都有不同的|值数量|
狗|猫|猴子|大象|芯片|香肠|豆子|老鼠|蚂蚁|任何东西|随便什么|一些对象|不知道|每一行都有不同的|值数量|
狗|猫|猴子|大象|筹码|香肠|豆子|老鼠|蚂蚁|任何东西|不管|一些对象|不知道|每一行都有不同的|值的数量|

即txt 文件中的每一行(在本例中有 3 行)似乎在 biD 结构中产生一个条目,其中包含 txt 文件中的所有行。 真的,每一行打印应该只包含 txt 文件中的一行项目。

代码如下:

import java.io.File;  
import java.io.FileNotFoundException;  
import java.util.ArrayList;  
import java.util.Arrays;  
import java.util.Scanner;  

public class testData {

    private static Scanner file;
    static int rows;

    public static void main(String[] args) throws FileNotFoundException {
        ArrayList<ArrayList<String>> biD = new ArrayList<ArrayList<String>>();
        file = new Scanner(new File("C:/tmp/text.txt"));
        ArrayList<String> line = new ArrayList<String>();

        while (file.hasNextLine()) {
            final String nextLine = file.nextLine();
            final String[] items = nextLine.split(",");

            for (int i = 0; i < items.length; i++) {
                line.add(items[i]);
            }

            biD.add(line);
            rows++;
            Arrays.fill(items, null); // to clear out the 'items' array
        }

        int col = biD.get(0).size();
        System.out.println("col is " + col);

        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < biD.get(i).size(); j++) {
                System.out.print(biD.get(i).get(j) + "|");

            }
            System.out.println();
        }

    }

}

基本上我的 biD 结构似乎存储了太多信息。

所以演练(我认为)是:

从文件中读取一行
存储在字符串中 (nextLine)
拆分字符串并将项目存储在字符串数组 (items)
将项目添加到数组列表(行)
将该数组列表添加到数组列表 biD。
(我想这就是我要出错的地方。我想可能不理解数组列表是如何正常工作的!)

大家有什么想法吗?

谢谢。

您需要为每一行创建一个新的 List 实例。

在您的代码中,您在每一行中放置了完全相同的列表实例,这导致所有行都相同。

所以将它移到你的 while 循环中

ArrayList<String> line = new ArrayList<String>();

行变量声明一次,每次换行时写入。必须将声明语句移到 while 循环内,因此会为每一行创建一个新语句。

public static void main(String[] args) throws FileNotFoundException {
    ArrayList<ArrayList<String>> biD = new ArrayList<ArrayList<String>>();
    file = new Scanner(new File("C:/tmp/text.txt"));
    //ArrayList<String> line = new ArrayList<String>(); <-- Move down to 

    while (file.hasNextLine()) {

        ArrayList<String> line = new ArrayList<String>(); <-- Down here      
        final String nextLine = file.nextLine();
        final String[] items = nextLine.split(",");

        for (int i = 0; i < items.length; i++) {
            line.add(items[i]);
        }

        biD.add(line);
        rows++;
        Arrays.fill(items, null); // to clear out the 'items' array
    }...