第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Java:如何將對象從 List<T> 添加到 Map(鍵:枚舉,值 List<T>)

Java:如何將對象從 List<T> 添加到 Map(鍵:枚舉,值 List<T>)

呼喚遠(yuǎn)方 2023-02-23 10:44:09
我正在嘗試將對象從添加List<Farm>到Map<Animal, List<Farm>>public class Farm {    private String farmName;    private EnumSet<Animal> animals = EnumSet.noneOf(Animal.class);    /* ... */}Farm f1 = new Farm("Farm A", EnumSet.of(Animal.CAT, Animal.DOG, Animal.DUCK));Farm f2 = new Farm("Farm B", EnumSet.of(Animal.PIG, Animal.CAT, Animal.HORSE));Farm f3 = new Farm("Farm C", EnumSet.of(Animal.DUCK));任務(wù) 1:將對象添加到List<Farm>List<Farm> list = new ArrayList<>();list.add(f1);list.add(f2);list.add(f3);任務(wù) 2:將列表中的對象添加到地圖(鍵:Animal,值:)List <Farm>我以這種方式完成了這項(xiàng)任務(wù):Map<Animal, List<Farm>> map = new HashMap<>();for(Farm farm: list) {    for(Animal an: farm.getAnimals()) {        if(!map.containsKey(an)) {            List<Farm> new_list = new ArrayList<>();            new_list.add(farm);            map.put(an, new_list);        }else {                 List<Farm> old_list = map.get(an);            if(!old_list.contains(farm)) {                old_list.add(farm);                    }            }        }    }有第二個(gè)/更有效的解決方案嗎?是這樣的:Map<Animal, List<Farm>> map = list.stream().collect(Collectors.groupingBy(Farm::getAnimals)));這不起作用,因?yàn)間etAnimals返回一個(gè)EnumSet<Animal>.
查看完整描述

2 回答

?
茅侃侃

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超21個(gè)贊

您可能希望保留循環(huán),但對其進(jìn)行現(xiàn)代化改造:


Map<Animal, List<Farm>> map = new EnumMap<>(Animal.class);

for(Farm farm: list)

    for(Animal an: farm.getAnimals())

        map.computeIfAbsent(an, x -> new ArrayList<>()).add(farm);

在你的循環(huán)中,add(farm)冗余出現(xiàn)在兩個(gè)分支中,因?yàn)槟憧偸菍⑺砑拥絃ist. 然后,computeIfAbsent允許消除條件,因?yàn)樗鼘⒎祷匾粋€(gè)現(xiàn)有值或構(gòu)造一個(gè)新值,放入并返回它。收集groupingBy器在內(nèi)部也使用這種方法。


使用 Stream 操作的缺點(diǎn)是您需要臨時(shí)持有兩個(gè)值,例如


Map<Animal, List<Farm>> map = list.stream()

    .flatMap(farm -> farm.getAnimals().stream()

        .map(animal -> new AbstractMap.SimpleImmutableEntry<>(animal, farm)))

    .collect(Collectors.groupingBy(Map.Entry::getKey,

        () -> new EnumMap<>(Animal.class),

        Collectors.mapping(Map.Entry::getValue, Collectors.toList())));


查看完整回答
反對 回復(fù) 2023-02-23
?
溫溫醬

TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊

我從對面開始,但我想這很有幫助

    Map<Animal, List<Farm>> map = Arrays.stream(Animal.values())
            .collect(Collectors.toMap(an -> an, an -> list.stream().filter(f -> f.getAnimals().contains(an)).collect(Collectors.toList())));

在沒有任何農(nóng)場包含動(dòng)物的情況下,動(dòng)物可能有空集,但這可以很容易地過濾


查看完整回答
反對 回復(fù) 2023-02-23
  • 2 回答
  • 0 關(guān)注
  • 115 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號