2017-03-29 1 views
0

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 

} 

は私がやりたいことは文字列のリストを取る方法を持っているこのリストを使用してPersonオブジェクトの数(下図)を作成したいですオブジェクトを動的に作成します。どのように私はこれを最善のことができますか?

2つのオブジェクトを確実に入れていることが分かっていたら、私は次のことができると知っていますが、問題は多少あるかもしれないということです。あなたのリストを再構築することは、私ははるかに良いだろうとあなたは再帰

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; 
} 

お知らせを使用することができます

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; 

} 

答えて

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; 
} 

一見を、私は別のフィールドの値を持つように感じます1つの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に設定しました。

+0

リストが8人のメンバーであれば、どのように私はそれが各フィールドに正しい文字列を配置するように調整するのだろうか? – java123999

+0

私はあなたの説明されたケースのために私の答えを編集しました。 – Zircon

0

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; 
0

あなたの要素にアクセスしたいと順次あなたは

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

       personList.add(person); 
    } 
     else break; 

しかしArrayListこのようなループでjava.util.LinkedListを使用する必要がありますし、あなたの場合はそのget方法が

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; 
} 
関連する問題