繁体   English   中英

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

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

希望能对您有所帮助。 仍然想让我的头脑变得井井有条!

我有一个文本文件的内容要存储(并在以后使用)到2D arraylist中。 文本文件示例如下所示(行数不确定的条目数不确定):

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

我希望能够按原样打印出文本文件,但将项目整齐地存储在我的2D arraylist(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)
分割字符串并将项目存储在字符串数组(项目)中
将项目添加到arraylist(行)
将该arraylist添加到arraylist biD。
(我认为这是我要出问题的地方。我认为可能不了解arraylists如何正常工作!)

有什么想法吗?

谢谢。

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

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

因此,将其移入while循环中

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

line变量只声明一次,每次获取新行时都会写入该变量。 声明语句必须在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
    }...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM