2016-04-11 10 views
14

オブジェクトのArraylistがあるとしましょう。Animalオブジェクトのクラスは、このようなものです:私は何をしたいかjavaを使用してリスト内のオブジェクトのプロパティをカウントする8

class Animal{ 
    String Name;//for example "Dog" 
    String Color 
} 

、色がArrayListに各動物のために存在するどのように多くの異なる数えるとString名前で、IntegerがためであるMap<String,Integer>に入れています異なる色の数例えば

4匹の黒犬と1白がある場合は、マップに置く相当

map.put("Dog",2); 

だろう私はそれがStreamを使用して行うことができます知っているが、私はどのように見つけることができません。

答えて

19

あなたがしたいのは、grouping operationという名前のプロパティをキーとして使用することです。それは簡単な部分です。トリッキー(Trickier)は、ダウンストリームコレクタとして「個数の色数」を表現することです。 JREにはそのようなコレクタがないため、Setストレージを利用してコレクタを構築する必要があります。組み込みのものがあったとしても、それはボンネットの下で同様のストレージを使用しなければならなかったことに注意してください。だからサイズを照会することによって色にmap the elementscollect them into Sets(のみ個別の値を保つ意味する)とfinish

Map<String, Integer> map = animalStream.collect(
    Collectors.groupingBy(Animal::getName, 
     Collectors.collectingAndThen(
      Collectors.mapping(Animal::getColor, Collectors.toSet()), 
      Set::size))); 
5

これは動作するはずです:ここでは

Map<String, Integer> map = animal.stream().collect(
      Collectors.groupingBy(
        Animal::getName, 
        Collectors.collectingAndThen(
          Collectors.mapping(Animal::getColor, Collectors.toSet()), 
          Set::size) 
        ) 
      ); 

いくつかのテストコード:

public static void main(String[] args) { 
    List<Animal> animal = new ArrayList<>(); 
    animal.add(new Animal("Dog","black")); 
    animal.add(new Animal("Dog","black")); 
    animal.add(new Animal("Dog","blue")); 
    animal.add(new Animal("Cat","blue")); 
    animal.add(new Animal("Cat","white")); 

    Map<String, Integer> map = animal.stream().collect(
      Collectors.groupingBy(
        Animal::getName, 
        Collectors.collectingAndThen(
          Collectors.mapping(Animal::getColor, Collectors.toSet()), 
          Set::size) 
        ) 
      ); 

    for(Entry<String, Integer> entry:map.entrySet()) { 
     System.out.println(entry.getKey()+ " : "+entry.getValue()); 
    } 

} 

Cat : 2 
Dog : 2 

注:この答えは、このことにより、SOポスト触発されました:https://stackoverflow.com/a/30282943/1138523

+0

あなたは、あなたがしたい場合は、テストコードのための地図::のforEachを使用することができます。map.forEach((キー、値) - >のSystem.out。 println(key + ":" + value)); – srborlongan

+2

ありがとう、知らなかった –

関連する問題