繁体   English   中英

如何将数据文件加载到arraylist中

[英]How do I load data file into an arraylist

我需要帮助来创建一种加载宠物的方法。 我在编写while循环时遇到困难,该循环读取文件pets.txt并将其存储在数组列表中并返回pet的总数。 装入宠物后,我需要创建一种方法来打印列表,找到最重的宠物的方法以及找到宠物的平均体重的方法。

这是我到目前为止的内容:

try {
    inFile = new Scanner(new FileReader("pets.txt"));
} catch (FileNotFoundException ex) {
    System.out.println("File data.txt not found");
    System.exit(1);
}

int i = 0;

while (inFile.hasNext() && i < list.length) {
    // cant figure out how to write this
    i++;
}

inFile.close();

return i;

pets.txt看起来像这样:

muffin, bobby, 25.0, pug
tiny, seth, 22.0, poodle
rex, david, 40.0, lab
lucy, scott, 30.0, bulldog

该信息的格式为

(宠物名称,主人名称,体重,品种)

在循环中,您遍历文件的每一行。 因此,您必须解析其内容(拆分)中的行 ,然后将信息保存到

其次,您应该创建一个Pet对象(对象和类)并将信息保存在每个对象中。 您的arraylist包含创建的对象。

如果您有一些特定的代码,也许有人会给您更具体的帮助。

到目前为止,您所做的也是“加载”文件。 现在,您必须使用inFile(扫描程序对象)来访问pets.txt的内容。 这可以通过许多方式完成,例如使用inFile.nextLine()(请参阅Javadocs)。

之后,使用字符串方法(例如split()(再次参见文档))以所需的格式提取所需的字符串的任何部分,以存储在Pets类中。

然后,您应该将每个Pets对象存储在一个数据结构(例如列表)中,以使您能够高效地编写所需的方法。

宠物课

Public class Pet {

    Public Pet(String pet_name, String owner, float weight, String breed) {
       this.pet_name = pet_name;
       this.owner = owner;
       this.weight = weight;
       this.breed = breed;
    }

    String pet_name;
    String owner;
    float weight;
    String breed;

    //implements getters and setters here
}

文件读取方式

private void read_file() throws Exception {

    Scanner scanner = new Scanner(new FileReader("filename.txt"));

    List<Pet> list = new ArrayList<>();

    while (scanner.hasNextLine()) {
       String[] data = scanner.nextLine().split(",");
       Pet pet = new Pet(data[0], data[1], Float.valueOf(data[2]), data[3]);
       list.add(pet);
    }
}

首先,我不会将数据读取到简单的数组列表中。 我可能会使用ArrayList类。 所以我要声明一个第二类,像这样:

//Declare pet class
class Pet{
    // Can be either public or private depending on your needs.
    public String petName;
    public String ownerName;
    public double weight;
    public String breed;
    //Construct new pet object
    Pet(String name, String owner, double theWeight, String theBreed){
      petName = name;
      ownerName = owner;
      weight = theWeight;
      breed = theBreed;
   }

}

然后回到您的主类,我将执行以下方法:

public ArrayList<Pet> loadFile(String filePath){
   ArrayList<Pet> pets = new ArrayList<Pet>();
   File file = new File(filePath);
   try {
    Scanner sc = new Scanner(file);
    while (sc.hasNextLine()) {
        String s[] = sc.nextLine().split(",");
        // Construct pet object making sure to convert weight to double.
        Pet p = new Pet(s[0],s[1],Double.parseDouble(s[2]),s[3]); 
        pets.add(p);    
    }
    sc.close();
    } 
    catch (FileNotFoundException e) {
       e.printStackTrace();
    }
    return pets;
}

这是我使用所需的方法解决此问题的方法。 我只是创建一个宠物类,创建一个宠物对象的数组列表,然后在使用扫描仪从文件中获取数据时将宠物对象添加到列表中!

宠物课

public class Pet {

//Fields Variables
private String pet_name;
private String owner_name;
private double weight;
private String breed;

//Constructor
public Pet (String name, String o_name, double weight, String breed) {

    //Set the variable values
    this.pet_name = name;
    this.owner_name = o_name;
    this.weight = weight;
    this.breed = breed;
}

//Getter and setter
public String getPet_name() {
    return pet_name;
}

public void setPet_name(String pet_name) {
    this.pet_name = pet_name;
}

public String getOwner_name() {
    return owner_name;
}

public void setOwner_name(String owner_name) {
    this.owner_name = owner_name;
}

public double getWeight() {
    return weight;
}

public void setWeight(double weight) {
    this.weight = weight;
}

public String getBreed() {
    return breed;
}

public void setBreed(String breed) {
    this.breed = breed;
}
}

主班

public class Main {

//ArrayList
private static ArrayList<Pet> pets = new ArrayList<>();

public static void main (String [] args) {

    try {
        Scanner sc = new Scanner(new File("path/to/file.txt")).useDelimiter(", |\n");

        while (sc.hasNext()) {

            //Get the info for the pet
            Pet pet;

            String name = sc.next();
            String owner_name = sc.next();
            double weight = sc.nextDouble();
            String breed = sc.next();

            //Create the pet and add it to the array list
            pet = new Pet (name, owner_name, weight, breed);
            pets.add(pet);

        }

        sc.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    //Add your custom pets here if you would like!
    addNewPet ("muffy", "john", 30.0, "beagle");

    //Custom Methods
    printList();
    findHeaviestPet();
    findLightestPet();
    getAveragePetWeight();

}

public static void printList () {

    for (int i = 0; i < pets.size(); i++) {
        System.out.println (pets.get(i).getPet_name()+" "+pets.get(i).getOwner_name()
                +" "+pets.get(i).getWeight()+" "+pets.get(i).getBreed());
    }

}

public static void findLightestPet () {
    //So we know the value will be assigned on the first pet
    double weight = Double.MAX_VALUE;
    int petIndex = 0;

    for (int i = 0; i < pets.size(); i++) {

        if (pets.get(i).getWeight() < weight) {
            weight = pets.get(i).getWeight();
            petIndex = i;
        }
    }

    System.out.println("The lightest pet is "+pets.get(petIndex).getPet_name()+", with a weight of "+pets.get(petIndex).getWeight());
}

public static void findHeaviestPet () {
    double weight = 0.0;
    int petIndex = 0;

    for (int i = 0; i < pets.size(); i++) {

        if (pets.get(i).getWeight() > weight) {
            weight = pets.get(i).getWeight();
            petIndex = i;
        }
    }

    System.out.println("The heaviest pet is "+pets.get(petIndex).getPet_name()+", with a weight of "+pets.get(petIndex).getWeight());
}

public static void getAveragePetWeight() {
    double weights = 0;

    for (int i = 0; i < pets.size(); i++) {

        weights += pets.get(i).getWeight();
    }

    weights = (weights / pets.size());

    System.out.println ("The average weight is "+weights);
}

public static void addNewPet (String name, String o_name, double weight, String breed) {
    Pet pet = new Pet(name, o_name, weight, breed);
    pets.add(pet);
}

}

Pets.txt

请确保在每个项目之间都有一个命令和空格,例如“,”,这样我们就知道何时下一个项目。

muffin, bobby, 25.0, pug
tiny, seth, 22.0, poodle
rex, david, 40.0, lab
lucy, scott, 30.0, bulldog
name, owner_name, 65.0, breed

暂无
暂无

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

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