我正在尝试使用将填充其字段的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;
}
答案 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;
}