需要帮助将文本文件读入Object

时间:2013-11-15 02:19:26

标签: java

我创建了一个Person类,其参数是firstname,lastname和year。我需要弄清楚如何从文本文件中读取输入并创建一个人员数组。这是我正在尝试的,基于我从网络汇集的不同来源。

String name = "People.txt";
        Person[] people = new ArrayList<Person>();
        BufferedReader br = new BufferedReader(new FileReader(name));
        String line = br.readLine();
        while(line != null)
        {
            people.add(line);
            line = br.readLine();
        }

但当然,这不起作用。我怀疑它是否接近正确,所以我想知道你们是否有任何建议。

此外,我的Person类的构造函数如下:

public Person(String firstName, String lastName, int age){
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }



The error reads,

`SortingImplementation.java:15: incompatible types
found   : java.util.ArrayList<Person>
required: Person[]
                Person[] people = new ArrayList<Person>();
                                  ^
SortingImplementation.java:20: cannot find symbol
symbol  : method add(java.lang.String)
location: class Person[]
                        people.add(line);
                              ^
Note: SortingMethod.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
2 errors
`

文本文件是

Larry Kim 45
Bob Stuart 51
Nancy Davis 38
John Doe   49
Henry Miles 23
Albert Lee 36
Mary Wing  43
Tony Rich  55
Ally Sneetch  19
Carrie Chrome 77
David Abkenzy 41
Young Old    18
Snow White  70
George Herald 60
Mike Bush 22
Peter Paul 33
Peter Pan 44
Mary Paul 25
Ray Romano 55
好吧,很好。你们真棒,也许今晚我会入睡。连续两天试图完成这项任务,开始产生幻觉。我遇到的最后一个问题,我确信它很简单,但我收到了这个错误。

SortingImplementation.java:15: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown
                BufferedReader br = new BufferedReader(new FileReader("People.txt"));
                                                       ^
SortingImplementation.java:16: unreported exception java.io.IOException; must be caught or declared to be thrown
                String line = br.readLine();

我认为这可能与我实例化的方式有关,或者我可能没有导入正确的头文件。这是我导入的内容。

import javax.swing.JOptionPane;
import java.util.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.io.*;
import java.nio.*;

你们看到任何可能遗漏的东西吗?

2 个答案:

答案 0 :(得分:1)

您有两种选择。

  1. 在不更改Person类的情况下,在阅读该行后,您可以将数据解析为firstNamelastNameage,并将这些参数发送到构造
  2. 您可以向Person添加一个构造函数,该构造函数需要一个未解析的String参数,并在构造函数中进行所有解析,并从那里分配初始化变量。
  3. 有关如何执行任一选项的详细信息,您必须向我们展示文本文件的确切内容。


    但目前,您的问题是您尝试将String个对象添加到ArrayListPerson个对象中。

    你需要这样做:

    people.add(new Person(/*constructor arguments*/));
    

    现在您已更新为包含文件格式,请尝试以下操作:

    while(line != null) {
        String[] lineParts = line.split("\\s+");
        people.add(new Person(lineParts[0],lineParts[1],parseInt(lineParts[2]));
        line = br.readLine();
    }
    

    通过额外的Person构造函数进行操作没有太大区别。

    Person课程中,添加以下构造函数:

    public Person(String s) {
        String[] parts = s.split("\\s+");
        this(parts[0], parts[1], parseInt(parts[2]));
    }
    

    然后在main中,让你的while循环看起来像这样:

    while(line != null) {
        people.add(new Person(line));
        line = br.readLine();
    }
    

答案 1 :(得分:1)

您不能只添加一行String并期望它神奇地转换为Person。您需要将每一行拆分为单独的String,然后从String

创建一个人
    Person[] people = new ArrayList<Person>();  
    BufferedReader br = new BufferedReader(new FileReader(name));
    String line = br.readLine();
    while(line != null)
    {
        people.add(line);
        line = br.readLine();
    }

您需要执行类似的操作,请注意从数组更改为ArrayList<Person>

    ArrayList<Person> people = new ArrayList<Person>();  // Notice change here
    BufferedReader br = new BufferedReader(new FileReader(name));
    String line;
    while((line = br.nextLine()) != null)
    {
        String[] tokens = line.split("\\s+");
        String firstName = tokens[0];
        String lastName = tokens[1];
        int age = Integer.parseInt(tokens[2]);  // parse String to int

        people.add(new Person(firstName, lastName, age));
    }

这假设输入文本的格式如下

  

FirstName LastName年龄

此外,请确保将所有内容都包含在try/catch块中,或使用方法throws IOException;