【问题标题】:Read data from a .txt file and create an object array从 .txt 文件中读取数据并创建对象数组
【发布时间】:2018-12-02 02:50:49
【问题描述】:

我需要一些帮助:我正在用 java 进行飞行名册模拟。名册将容纳 25 名乘客,其中 22 名来自文本文件 (PassengerList.txt)。对于每位乘客,需要 3 个数据点;姓名、座位等级和座位号以及 2 个可选数据点常旅客编号和常旅客积分。每个乘客都在自己的行上,每个数据点用逗号分隔。例如:

Allen George,Economy Class,8A,#GEO456,10000
Judy Hellman,Economy Class,8B

到目前为止,我有这个类以及构造函数:

public class Passengers
{

  private String name, type, seat, flyernum;
  private int points;

  //Constructor to intialize the instance data
  Passengers(String full_name, String seat_type, String seat_number,
  String frequent_flyer_number, int frequent_flyer_points) 
  { 
    name=full_name;
    type=seat_type;
    seat=seat_number;
    flyernum=frequent_flyer_number;
    points=frequent_flyer_points;
  } //end Passengers 

我需要做的是从文本文件中读取每一行并创建数组,即使第一行看起来像这样:

Passenger passenger1 = new Passenger ("Allen George","Economy Class","8A" 
,"#GEO456",10000)

到这样的数组中:

Passenger[0] = passenger1;

我显然是一个 java 初学者,但我已经被这个问题困扰了很长时间,当我尝试新的东西时,我不断收到不同的错误消息。我一直在使用扫描仪来读取文件。文本文件不需要被覆盖,只需由程序读取和扫描即可。也只能使用数组,ArrayList 是不行的。也只有两个文件,Passengers 类和 main 方法。请帮忙!谢谢!

【问题讨论】:

  • 为什么用javascript标记?
  • @OldProgrammer 那是我的错,我是新来的,哈哈
  • 我不确定数组是否适合您。为什么它需要是一个数组?我认为您最好将其列为乘客名单。因此,您可以将文件读入如下列表:List<Passenger> pasengers = new ArrayList<>();
  • @magerine 我只是想保持简单。我可以使用 .toArray 将其转换回来吗?

标签: java arrays


【解决方案1】:

你可以这样做:

首先你需要一个Passenger.class。它看起来像这样(注意我添加了一个 toString():

public class Passenger {

private String name, type, seat, flyernum;
private int points;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}

public String getSeat() {
    return seat;
}

public void setSeat(String seat) {
    this.seat = seat;
}

public void setFlyernum(String flyernum) {
    this.flyernum = flyernum;
}

public int getPoints() {
    return points;
}

public void setPoints(int points) {
    this.points = points;
}

@Override
public String toString() {
    return "Passenger{" +
            "name='" + name + '\'' +
            ", type='" + type + '\'' +
            ", seat='" + seat + '\'' +
            ", flyernum='" + flyernum + '\'' +
            ", points=" + points +
            '}';
}

}

现在为了从文件中获取乘客详细信息,我创建了 GetPassengerDetails.class,它处理从 CSV 文件中读取数据并为每个乘客分配正确的值。

public class GetPassengerDetails{
/** Reads the file one line at a time. Each line will is that split up and translated into a Passenger object */
public List<Passenger> getPassengersFromFile(BufferedReader reader) throws IOException {
    List<Passenger> passengers = new ArrayList<>();

    String line;
    while ((line = reader.readLine()) != null) {
        String[] passengerDetails = line.trim().split(",");
        Passenger passenger = new Passenger();
        for (int i = 0; i < passengerDetails.length; i++) {

            SetPassengerName(passengerDetails, passenger, i);

            setPassengerFlightType(passengerDetails, passenger, i);

            setPassengerSeatNumber(passengerDetails, passenger, i);

            SetPassengerFlyerNumber(passengerDetails, passenger, i);
            setPassengerPoints(passengerDetails, passenger, i);
        }

        passengers.add(passenger);

    }

    return passengers;
}

private void setPassengerPoints(String[] passengerDetails, Passenger passenger, int i) {
    if(i< passengerDetails.length && i == 4) {
        passenger.setPoints(Integer.parseInt(String.valueOf(passengerDetails[4])));
    }
}

private void SetPassengerFlyerNumber(String[] passengerDetails, Passenger passenger, int i) {
    if(i< passengerDetails.length && i == 3) {
        passenger.setFlyernum(String.valueOf(passengerDetails[3]));
    }
}

private void setPassengerSeatNumber(String[] passengerDetails, Passenger passenger, int i) {
    if(i< passengerDetails.length && i == 2) {
        passenger.setSeat(String.valueOf(passengerDetails[2]));
    }
}

private void setPassengerFlightType(String[] passengerDetails, Passenger passenger, int i) {
    if(i< passengerDetails.length && i == 1) {
        passenger.setType(String.valueOf(passengerDetails[1]));
    }
}

private void SetPassengerName(String[] passengerDetails, Passenger passenger, int i) {
    if(i< passengerDetails.length & i == 0) {
        passenger.setName(String.valueOf(passengerDetails[i]));
    }
}

}

这是测试上述代码的主要方法:

public class Main {

public static void main(String[] args) throws IOException {

      String fileName = "resources/passengers.csv";

    BufferedReader reader = new BufferedReader(new FileReader(fileName));
    GetPassengerDetails passengerDetails = new GetPassengerDetails();

    List<Passenger> passengers = passengerDetails.getPassengersFromFile(reader);

    // For Testing Purposes lets get the Passengers

    for (Passenger passenger : passengers
            ) {
        System.out.println(passenger.toString());
    }
  }
}   

运行 main 方法后,你会得到这样的结果:

【讨论】:

  • 非常感谢!有什么办法可以将其合并为两个文件(只是乘客类和主要方法)?非常感谢,文件非常清晰简洁!谢谢!
【解决方案2】:

使用此主要方法从文本文件中读取数据并将数据聚合到Passengers 对象中。乘客列表对象中的整个乘客列表。

public static void main(String[] args) {
    List<Passengers> passengersList = new ArrayList<Passengers>();
    File file = new File("Your file location..");
    try {
        BufferedReader br = new BufferedReader(new FileReader(file));
        String st;
        while ((st = br.readLine()) != null){
            String[] data = st.split(",");
            String flyNumber = null;
            int flyPoints = 0;
            switch (data.length){
                case 4: flyNumber = data[3];
                    break;
                case 5: flyNumber = data[3];
                    flyPoints = Integer.valueOf(data[4]);
                    break;
            }
            Passengers passenger = new Passengers(data[0], data[1], data[2], flyNumber, flyPoints);
            passengersList.add(passenger);
        }
        System.out.println(passengersList.get(0));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

【讨论】:

    猜你喜欢
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2021-02-05
    • 1970-01-01
    相关资源
    最近更新 更多