将.txt文件的内容读入2D字符串ARRAYLIST

时间:2015-09-22 11:59:13

标签: java string arraylist 2d

希望你能提供帮助。仍然试图让我的头围绕java!

我将要存储(稍后使用)的文本文件的内容放入2D arraylist中。 文本文件示例如下所示(不确定行数上的条目数不确定):

狗,猫,猴,象
芯片,香肠,豆子,鼠标,蚂蚁
任何东西,无论如何,某些物体,不知道,每一行都有不同的数值

我希望能够像现在一样打印出文本文件,但项目整齐地存储在我的2D arraylist(biD)中 e.g:

狗|猫|猴子|大象|
芯片|香肠|豆|鼠标|蚂蚁|
任何|任何|某个对象| dunno |每一行都有不同的|数量的值|

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

col是15
狗|猫|猴子|大象|芯片|香肠|豆|鼠标|蚂蚁|任何|任何|某些对象| dunno |每行都有不同的|数量的值|
狗|猫|猴子|大象|芯片|香肠|豆|鼠标|蚂蚁|任何|任何|某些对象| dunno |每行都有不同的|数量的值|
狗|猫|猴子|大象|芯片|香肠|豆|鼠标|蚂蚁|任何|任何|某个对象| dunno |每一行都有不同的|数量的值|

即。 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)
拆分字符串并将项目存储在字符串数组(项目)中 将项目添加到arraylist(行)
将该arraylist添加到arraylist biD (我认为这是我出错的地方。也许我不会理解arraylists如何正常工作!)

任何想法,任何人?

感谢。

2 个答案:

答案 0 :(得分:1)

每行需要一个新的List实例。

在你的代码中,你在每行中放入完全相同的list实例,这导致所有行都相同。

所以在你的while循环中移动它

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

答案 1 :(得分:0)

行变量声明一次,并在每次获得新行时写入。声明语句必须在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
    }...