使用字符串列表动态创建对象?

时间:2017-03-29 13:36:51

标签: java string list object constructor

我正在尝试使用将填充其字段的objects列表来创建Strings。例如,我有字符串列表,请注意,值在每3个之后重复,即id, name , address

List<String> myList = "Id1", "name1", "address1", "Id2", "name2", "address2";

我想动态使用此列表创建一些人物对象(如下所示)

Person object:

public class Person {

    private String id;
    private String name;
    private String address;

     public Person() {
    }

    public Person(String id, String name, String address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }

    //standard getters and setters

}

我想要做的是有一个方法,它将字符串列表作为输入,然后动态创建对象。我怎么能最好地做到这一点?

我知道如果我知道我肯定会填充2个对象,我可以执行以下操作,但问题是可能会有更多或更少。

public List<Person> createObjectsFromStringList(List<String> list){

    List<person> personList = new Arraylist<>();

    Person person1 = new Person(list.get(0), list.get(1), list.get(2));
    Person person2 = new Person(list.get(3), list.get(4), list.get(5));

    personList.add(person1);
    personList.add(person2);

    return personList;

}

4 个答案:

答案 0 :(得分:2)

一个简单的for循环可以完成这项工作:

public List<Person> createObjectsFromStringList(List<String> list) {

    List<person> personList = new Arraylist<>();
    //We use < size-2 here because we access 2 indeces ahead of x in this loop
    for(int x=0; x<list.size()-2; x+=3) { 
        personList.add(new Person(list.get(x), list.get(x+1), list.get(x+2));
    }
    return personList;
}

乍一看,我觉得在一个List中使用不同的字段值是代码结构不佳的标志,但也许你已经按原样List停留了。< / p>

修改

现在让我们假设你想要一个基于剩余元素数量的部分Person。假设它们仍然处于相同的顺序,您可以修改此方法以检查每个字段的当前索引的有效性:

public List<Person> createObjectsFromStringList(List<String> list) {

    List<person> personList = new Arraylist<>();
    int size = list.size();
    //Now we remove the "-2" from size check because we will handle this ourselves
    for(int x=0; x<size; x+=3) {
        String id = list.get(x); //Obviously valid
        String name = x+1 < size? list.get(x+1) : null;
        String address = x+2 < size? list.get(x+2) : null;
        personList.add(new Person(id, name, address);
    }
    return personList;
}

我们在这里使用三元操作? ... : null,因此如果我们用完了元素,我们会将关联的Person字段设置为null,而不是使用越界索引

答案 1 :(得分:0)

您可以使用递归

public List<Person> createObjectsFromStringList(List<String> list){

List<person> personList = new Arraylist<>();    
for(int i=0; i<list.size(); i++){
     personList.add(new Person(list(i),list(i+1),list(i+2)));
     i+=2;
}
 return personList;
}

请注意,重组您的列表会更好。像这样:

List<String> myList = "Id1_name1_address1", "Id2_name2_address2";

甚至使用不同的列表(它更好)。如果您更改上面的列表结构,请将代码更改为:

public List<Person> createObjectsFromStringList(List<String> list){

List<person> personList = new Arraylist<>();    
for(int i=0; i<list.size(); i++){
     String[] info= list(i).split("_"); // this will give u a 3element array of yout info IdX nameX addressX
     personList.add(new Person(info(0),info(1),info(2)));
     }


return personList;

答案 2 :(得分:0)

由于您希望按顺序访问元素,因此应在此类循环中使用java.util.LinkedList

    for(true)
        if(linkedList.size()>=3){
                 Person person=   new 
Person(linkedList.removeFirst(),linkedList.removeFirst(),linkedList.removeFirst());

                 personList.add(person);
    }
        else break;

但是ArrayList及其get方法适用于索引的随机访问,而不是你的情况

答案 3 :(得分:0)

如果你使用java 8,你可以尝试这样的事情:

  public List<Person> createObjectsFromStringList(List<String> list) {
      //partition by 3 and list.size.
    Map<Integer,List<Integer>> map = IntStream
            .range(0,list.size())
            .boxed()
            .collect(Collectors.groupingBy(e->(e)/3));

    List<Person> personList = new ArrayList<>();

    map.entrySet().forEach(e->{
        List<String> per= e.getValue();
        Person p = new Person(per.get(0),per.get(1),per.get(2));
        personList.add(p);
    });
    return personList;
}