2017-06-09 7 views
0

私の問題について説明しましょう。JAVAのクラスのリストから特定のフィールドをコピーする方法は?

私はPersonクラスにmPeople Listに格納されています。 これは、mPeopleが「名前」と「年齢」の両方を格納することを意味します。 しかし、特定の状況では、私はすべての人の名前のリストと、異なるリストのすべての人の年齢のリストが必要です。

リスト内のクラスの特定のフィールドにあるすべてのデータを別のリストまたは別の場所にコピーする方法はありますか?

注:私はforループまたはこれを行うループを強化することができますが、これではあまりうまく見えません。だから誰かがもっと良い解決策を見つけたのかどうか不思議に思うだけです...そして、私はあなたの助けに感謝します!

public class Person 
{ 

// fields 
    private int age; 
    private String name; 


    // constructor 
    public Person(int age, String name) 
    { 
     this.age = age; 
     this.name = name; 
    } 


    // getter 
    public int getAge() 
    { 
     return age; 
    } 

    public String getName() 
    { 
     return name; 
    } 
} 


//list of People 
List<Person> mPeople = new ArrayList<>(); 
mPeople.add(new Person(10, "Sovanara")); 
mPeople.add(new Person(20, "Dara")); 

答えて

3

は、Java 8を使用している場合は、ストリームの上にマッピングすることができます:

final List<String> names = mPeople.stream() 
    .map(it -> it.getName()) 
    .collect(Collectors.toList()); 

final List<Integer> ages= mPeople.stream() 
    .mapToInt(it -> it.getAge()) 
    .collect(Collectors.toList());  

を私は」ここでは2つのパスとしてこれをやって、それぞれがどのように見えるかを示します。 1回のパスを行う場合は、forEachの副作用としてこれらを行うことができます。あなたがリソースが逼迫している場合、考える価値があるかもしれない大規模な人々のために。

編集:(副作用によって異なります)のシングルパス・ソリューション:

final List<String> names = new ArrayList<>(); 
final List<Integer> ages = new ArrayList<>(); 
mPeople.stream().forEach({ it -> 
    names.add(it.getName()); 
    ages.add(it.getAge()); 
}); 

あなたもKotlinとしてこれをタグ付けするので、解決策は似ています:私は見

val names = mPeople.map { it.name } 
val ages = mPeople.map { it.age } 
+0

。ちなみに、あなたはforeachの副作用について言及しています。それは、多くのパスや多くの操作時間ではなく、1回のパスを使用するほうがよいでしょうか?私はちょうど確かめる1つです。 – jujuzi

+0

それは異なります。私は個人的に2つのパスを理解して従うことが容易であることがわかります。ただし、1回のパスで効率的です。あなたが人の小さなリストを持っている場合、それは本当に多くの違いを作りません、あなたがする必要がある場合のみ最適化します。私は、それが重要ではない場合、少しのパフォーマンスを犠牲にしてコードを読みやすくするという面で間違っている傾向があります。 – Todd

+1

私はそれをチェックアウトし、.toList()を使ってリストに変換する必要がないことを知りました。コトリンのように思えます..そして最後に、素晴らしい解決策と助言に感謝します。 – jujuzi

1

簡単な解決策はストリームを使用することです。あなたは、Javaの正しいバージョンを使用している必要があります。もちろん、

List<Integer> mAges = new ArrayList<>(); 
List<String> mNames = new ArrayList<>(); 
mPeople.stream().forEach(p->{mAges.add(p.getAge()); 
          mNames.add(p.getName()); 
          } 
         ); 

簡単な例では、このようなものを見ることができます。 ちょうど楽しみのために、私はストリームなしでそれを行うためにいくつかの方法を追加すると思ったが、私はこの場合ストリームを使用することを好むだろう。

おそらく最も基本的な方法:

for(int i =0; i < mPeople.size();i++){ 
    mAges.add(mPeople.get(i).getAge()); 
    mNames.add(mPeople.get(i).getName()); 
} 

別の方法:

for(Person p: mPeople){ 
    mAges.add(p.getAge()); 
    mNames.add(p.getName()); 
} 
関連する問題