如何动态拆分arraylist?

时间:2013-10-13 15:10:32

标签: java for-loop arraylist

*免责声明:我是java中的超级菜鸟,所以请耐心等待。

我有一个名为hw_list的arraylist,其中包含从文件中读取的字符串,如下所示:

    [Doe John 1 10 1 Introduction.java, Doe Jane 1 11 1 Introduction.java, Smith Sam 2 15 2 Introduction.java Test.java]

我能够将数组的每个元素作为自己的子列表,因此它的打印方式如下:

    [Doe John 1 10 1 Introduction.java] 
    [Doe Jane 1 11 1 Introduction.java]
    [Smith Sam 2 15 2 Introduction.java Test.java]

但是要将每个元素拆分成它自己的子列表,如上所述,我必须手动编写每个子列表,如:

    List<String> student1 = hw_list.subList(0, 1);
    List<String> student2 = hw_list.subList(1, 2);
    List<String> student3 = hw_list.subList(2, 3);

我的问题是读入的字符串数量可能会发生变化,因此我不知道要提前制作多少个子列表。

有没有办法使用循环动态创建新列表,然后根据hw_list.size()拆分每个元素?

有点像这样:

    for(int i=0; i<hw_list.size(); i++){
        List<String> student(i) = hw_list.sublist(i, i+1)
    }

TL; DR

如何获取循环为数组的每个元素创建新列表?

2 个答案:

答案 0 :(得分:1)

您编码的内容运行良好,逻辑上没有意义:您拥有的单项子列表无法通过添加更多元素进行扩展,并且它们也会随着基础数组列表而更改。

您应该做的是构建一个类来将存储在单个元素中的数据表示为一组相关的,有意义的项目,例如提交的名字,姓氏,部分和日期,如下所示:

public class Student {
    private String firstName;
    private String lastName;
    private List<String> fileNames;
    private int section;
    private int date; // Consider changing this to a different type
    public Student(String firstName, String lastName, int section, int date) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.section = section;
        this.date = date;
        fileNames = new ArrayList<String>();
    }
    public String getFirstName() { return firstName; }
    public String getLastName() { return lastName; }
    public int getSection() { return section; }
    public int getDateSubmitted() { return date; }
    public List<String> getFileNames() { return fileNames; }
}

然后你可以制作一个采用String的方法,并产生一个Student,如下所示:

private static Student studentFromString(String studentRep) {
    String[] tokens = studentRep.split(" ");
    Student res = new Student(tokens[0], tokens[1], Integer.parseInt(tokens[2]), Integer.parseInt(tokens[3]));
    // You can ignore tokens[4] because you know how many files are submitted
    // by counting the remaining tokens.
    for (int i = 5 ; i != tokens.length ; i++) {
        res.getFileNames().add(tokens[i]);
    }
    return res;
}

答案 1 :(得分:1)

按照dasblinkenlight的建议,将每个String转换为学生:

List<Student> students = new ArrayList<Student>();
for(String studentRep:hw_list){
    students.add(Student.studentFromString(studentRep));
}

然后你就可以对你的学生名单进行处理,如下:

for(Student student:students){
    System.out.println(student.getFirstName());
}