繁体   English   中英

如何从 .t​​xt 文件中读取对象数组

[英]How to read from a .txt file into an array of objects

我在 .txt 文件中有以下示例数据

111, Sybil, 21
112, Edith, 22
113, Mathew, 30
114, Mary, 25

所需的输出是

[{"number":"111","name":"Sybil","age":"21" },
{"number":"112","name":"Edith","age":"22"},
{"number":"113","name":"Mathew","age":"30"},
"number":"114","name":"Mary","age":"25"]

可悲的是,我并没有走多远,因为我似乎无法从每一行中获取价值。 相反,这是显示的内容

[一二三]

    private void loadFile() throws FileNotFoundException, IOException {
        File txt = new File("Users.txt");
        try (Scanner scan = new Scanner(txt)) {
            ArrayList data = new ArrayList<>() ;
            while (scan.hasNextLine()) {
                
                data.add(scan.nextLine());
                 System.out.print(scan.nextLine()); 
            }
             System.out.print(data); 
               
            
        }

我将不胜感激任何帮助。 谢谢你

不太清楚要求。 如果您只需要知道如何获取值,请结合使用String.split()Scanner.nextLine()

以下代码:

    private void loadFile() throws FileNotFoundException, IOException {
    File txt = new File("Users.txt");
    try (Scanner scan = new Scanner(txt)) {
        ArrayList data = new ArrayList<>();
        while (scan.hasNextLine()) {
            // split the data by ", " and split at most (3-1) times
            String[] input = scan.nextLine().split(", ", 3);
            data.add(input[0]);
            data.add(input[1]);
            data.add(input[2]);

            System.out.print(scan.nextLine());
        }
        System.out.print(data);
    }
}

输出如下,您可以自己进一步修改:

[111, Sybil, 21, 112, Edith, 22, 113, Mathew, 30, 114, Mary, 25]

但是,如果您也需要所需的格式,我能得到的最接近的方法是使用HaspMap并将其放入ArrayList

以下代码:

    private void loadFile() throws FileNotFoundException, IOException {
    File txt = new File("Users.txt");
    try (Scanner scan = new Scanner(txt)) {
        ArrayList data = new ArrayList<>();
        while (scan.hasNextLine()) {
            // Create a hashmap to store data in correct format,
            HashMap<String, String> info = new HashMap();
            String[] input = scan.nextLine().split(", ", 3);
            info.put("number", input[0]);
            info.put("name", input[1]);
            info.put("age", input[2]);
            
            // Put it inside the ArrayList
            data.add(info);
        }
        System.out.print(data);
    }
}

输出将是:

[{number=111, name=Sybil, age=21}, {number=112, name=Edith, age=22}, {number=113, name=Mathew, age=30}, {number=114, name=Mary, age=25}]

希望这个答案对您有所帮助。

目前,您正在跳线。 来自Scanner::nextLine文档的引用:

此方法返回当前行的其余部分,不包括末尾的任何行分隔符。 位置设置为下一行的开头。

因此,您将在列表中添加一行,并将下一行写入控制台。

要从每一行获取数据,您可以使用支持RegExString::split方法。

例子:

"line of my file".split(" ")

我们可以使用流来编写一些紧凑的代码。

首先我们定义一个record来保存我们的数据。

Files.lines将您的文件读入内存,产生一个字符串流,每行一个。

我们调用Stream#map来生成另一个流,即一系列字符串数组。 每个数组包含三个元素,即每行中的三个字段。

我们再次调用map ,这次是为了生成一个Person对象流。 我们通过解析行的三个字段中的每一个并将其传递给构造函数来构造每个人对象。

我们调用Stream#toList将这些人员对象收集到一个列表中。

我们调用List#toString来生成表示人员对象列表内容的文本。

record Person ( int id , String name , int age ) {}
String output = 
    Files
    .lines( Paths.of("/path/to/Users.txt" ) )
    .map( line -> line.split( ", " ) )
    .map( parts -> new Person( 
        Integer.parseInt( parts[ 0 ] ) , 
        parts[ 1 ] ,
        Integer.parseInt( parts[ 2 ] ) 
    ) )
    .toList()
    .toString() 
;

如果默认Person#toString方法的格式不适合您,请添加对该方法的覆盖以生成所需的输出。

暂无
暂无

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

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