有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我试图通过使用将填充其字段的Strings列表来创建objects。例如,我有一个字符串列表,请注意,值在每3个之后重复一次。i、 e.id, name , address

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

我想使用此列表动态创建大量Person对象(如下所示)

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) 个答案

  1. # 1 楼答案

    当您希望按顺序访问元素时,应该在这样的循环中使用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方法适合通过索引进行随机访问,而您的情况并非如此

  2. # 2 楼答案

    如果您使用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;
    }
    
  3. # 3 楼答案

    可以使用递归

    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;
    
  4. # 4 楼答案

    一个简单的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卡住了

    编辑:

    现在让我们假设您想要一个基于剩余元素数量的部分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,而不是使用越界索引