【问题标题】:JAVA - How to create an array of objects?JAVA - 如何创建对象数组?
【发布时间】:2013-05-28 08:05:47
【问题描述】:

我需要将 CSV 文件读入对象数组。 我没有意识到它必须进入一个,而只是做了一个 ArrayList 。我现在需要解决这个问题,但不知道我在做什么。

这是我将 CSV 文件读入多维数组的代码。

public static void readClub() throws IOException {
        BufferedReader clubBR = new BufferedReader(new FileReader(new File("nrlclubs.txt")));
        String line = "";

        ArrayList<String[]> clubsArr = new ArrayList<String[]>(); 

        while ((line = clubBR.readLine()) != null) { 

            String[] club = new String[3]; 

            for (int i = 0; i < 3; i++) { 
                String[] value = line.split(",", 3);
                club[i] = value[i]; 
            }

            clubsArr.add(club); 
        }

我的 CSV 文件的 sn-p 是这样的:

Glebe,G Shield,Glebe District
Cumberland,C Shield,Central Cumberland
Annandale,A Shield,Annandale District
University,Lion,Sydney Uni Rugby League Club
Souths,Rabbit,South Sydney,Rabbitohs
Easts,Rooster,Eastern Suburbs,Roosters,Sydney Roosters
Balmain,Tiger,Tigers,Balmain Tigers
Newtown,Jets,Jets,Newtown Jets,Bluebags

第一个词是队名,第二个词是队吉祥物,其余是别名。

现在的问题是,我该如何做同样的事情,但使用一个对象数组(在一个名为 Clubs 的类中)? 我只是花了几个小时试图让这个工作,只是被告知它是错误的,并且对象数组正在做我的头脑:'(

谢谢大家!

编辑: 好的,实际的问题是这样的: 程序应将数据文件 (NRLclubs.txt) 的内容读入内存,并放入适当的对象数组中(有关类的描述,请参见上一页)。不要假设文件存在。

类的描述是这样的: 俱乐部类:俱乐部类代表比赛中的单个 NRL 俱乐部。 Club 类需要存储当前俱乐部名称、当前俱乐部吉祥物、俱乐部已知或已知的任何别名的数据。除了应该为类创建的常规方法(例如,构造函数、“setters”和“getters”)之外,您还需要根据分配规范的一般要求为此类确定适当的方法。

【问题讨论】:

  • 我不太明白:你希望变量 clubsArr 是 Object 数组而不是 ArrayList 吗?还是别的?
  • 您想从文件中读取数据并将其保存到对象数组中吗?请更具体。
  • 为了更优化的代码,String[] value = line.split(",", 3); 应该在for 之外,不需要每次都拆分。其实整个for是不需要的,clubsArr.add(value);就可以了。
  • 是的,我想摆脱 Arraylist 并将其读入对象数组。我以前从未使用过对象数组,所以我不知道自己在做什么。任何帮助将不胜感激:)

标签: java arrays class object csv


【解决方案1】:

创建一个新的类来保存一行的数据。 在最简单的情况下,您可以像这样创建一个类:

class MyClass {
     public String column1;
     public String column2;
     public ArrayList<String> aliases = new ArrayList<String>();

     public void addAliases(String[] a){
        for(int i=2;i<a.length;i++){
           aliases.add(a[i]);
        }
     }
}

然后像这样更改您的 ArrayList:ArrayList&lt;MyClass&gt; clubsArr = new ArrayList&lt;MyClass&gt;();

你的阅读部分是这样的:

while ((line = clubBR.readLine()) != null) { 

        MyClass club = new MyClass; 

        String[] value = line.split(",", 3);
        club.column1 = value[0]; 
        club.column2 = value[1]; 
        // etc...
        clubsArr.add(club); 

    }
    MyClass[] clubs = clubsArr.toArray();

这样,您以后就可以使用其中一个对象的属性名(在本例中为 .column2)而不是您必须记住的某个索引来从其中一个对象中获取一个值。

请注意,您可以根据自己的喜好调用类中的属性(例如 clubname 而不是 column1

编辑(帮助 OP 编辑​​) 要检查文件是否存在,请替换该行 BufferedReader clubBR = new BufferedReader(new FileReader(new File("nrlclubs.txt")));

File file = new File("nrlclubs.txt");
if(!file.exists()){
    System.exit(1); // no use to go any further if we have no input
}
BufferedReader clubBR = new BufferedReader(new FileReader(file));

【讨论】:

  • OP 说在名为 Clubs 的课程中​​
  • clubsArr.toArray() 应该在循环之外。
  • 最好使用带有私有成员字段的clubsArr.add(new Clubs(value[0],value[1],value[2]));这样的构造函数。
  • 最好将整行解析到构造函数。
  • @whoAmI 谢谢。我猜这来自速度。已编辑
【解决方案2】:

我不太理解你的问题,但也许你正在寻找这个:

public static void readClub() throws IOException {
        BufferedReader clubBR = new BufferedReader(new FileReader(new File("nrlclubs.txt")));

    String line = "";

    ArrayList<Clubs> clubs = new ArrayList<Clubs>();

    while ((line = clubBR.readLine()) != null) { 

        Clubs club = new Clubs();

        String[] value = line.split(",", 3);
        club.name = value[0]; 
        club.mascot = value[1];
        club.alias = value[2];

        clubs.add(club); 
    }

}

【讨论】:

  • 感谢您的快速回复。为了帮助澄清我想要做什么,我编辑了原始帖子
  • 我的回答满意吗?
  • 嗯,有点:) 我可以将其用作参考。感谢您的帮助!
猜你喜欢
  • 2020-12-17
  • 2013-04-30
  • 2010-12-31
  • 2011-07-31
  • 2021-07-30
  • 1970-01-01
  • 2011-07-18
  • 2019-10-28
相关资源
最近更新 更多