1

現在、Java 8 ストリームの使用方法を理解するのに苦労しています。lista_dottori( ) から、すべての医療専門分野 ( メソッド) に、この専門分野を持つ医師がいる患者の数をマップMap<Integer, Doctor>する新しいマップに移動しようとしています (クラス内のメソッドは、その医師の患者のa を返します)。この目的でカウント方法を使用する方法を理解できず、インターネット上でこの種の問題の例や説明を見つけることができないようです。patientsPerSpgetSpecializationgetPatientsDoctorList

それは私が書いたものです、それは私にカウントセクションでエラーを与えます:

public Collection<String> countPatientsPerSpecialization(){
    patientsPerSp=
            lista_dottori.values().stream()
            .map(Doctor::getSpecialization)
            .collect(groupingBy(Doctor::getSpecialization, counting(Doctor::getPatients.size())))
            ;
}
4

3 に答える 3

1

患者リストのサイズを合計したいようです。これはsummingInt()コレクターが行うことができますcounting()(発生をカウントするだけで、この場合は医師) ではありません。また、ここではマッピングは不要のようです。だからあなたは書くことができます:

patientsPerSp = lista_dottori.values().stream()
        .collect(groupingBy(Doctor::getSpecialization, 
                 summingInt(doctor -> doctor.getPatients().size())));

複数の医師が同じ患者を担当している場合、結果は正しくないことに注意してください (この方法では複数回カウントされます)。あなたのケースで可能であれば、一連の患者を作成することをお勧めします。

patientsPerSp = lista_dottori.values().stream()
        .collect(groupingBy(Doctor::getSpecialization, 
                 mapping(Doctor::getPatients(), toSet())));

このようにして、特殊化を患者のセットにマップするマップが作成されるため、このセットのサイズは必要な数になります。設定せずにカウントが必要な場合は、次の方法で最終ステップを追加できますcollectingAndThen()

patientsPerSp = lista_dottori.values().stream()
        .collect(groupingBy(Doctor::getSpecialization, 
                 collectingAndThen(
                     mapping(Doctor::getPatients(), toSet()),
                     Set::size)));
于 2015-05-23T15:43:59.227 に答える
0

ストリームの使用を避けて問題を解決しました。それが私が使用したソリューションです:

public Collection<String> countPatientsPerSpecialization(){

    int numSpec = 0;
    Map<String, Integer> spec = new HashMap<>();

    for(Doctor d : lista_dottori.values()){
        if(!spec.containsKey(d.getSpecialization())){
            spec.put(d.getSpecialization(), d.getPatients().size());
            numSpec++;
        }
        else{ //cioè se la specializzazione c'è già
            spec.replace(d.getSpecialization(), +d.getPatients().size()); 
        }
    }
    patientsPerSp.add(spec.keySet() + ": " + spec.values());
    for(String s : patientsPerSp)
        System.out.println(s);
    return patientsPerSp;
}

非常によく公開されていましたが、ソリューションを使用して解決できなかったようです。申し訳ありません。とにかく時間を割いて答えてくれてありがとう

于 2015-05-27T11:15:09.630 に答える