当前位置: 首页 > 知识库问答 >
问题:

Java:如何将对象从list添加到Map(键:枚举,值list)

萧安怡
2023-03-14
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));
List<Farm> list = new ArrayList<>();
list.add(f1);
list.add(f2);
list.add(f3);
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);
                    }
            }
        }
    }

有第二个/更有效的解决方案吗?类似于这样:

Map<Animal, List<Farm>> map = list.stream().collect(Collectors.groupingBy(Farm::getAnimals)));

这不起作用,因为getAnimals返回一个枚举集

共有1个答案

钱毅
2023-03-14

您可能希望继续使用循环,但要对其进行现代化:

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

在循环中,add(farm)冗余地出现在两个分支中,因为您总是将其添加到列表中。然后,ComputeIfAbsity允许消除条件,因为它将返回一个现有值或构造一个新值,放入并返回它。groupingby收集器也在内部使用此方法。

对其使用流操作有一个缺点,即您需要两个值的临时持有者,例如。

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())));
 类似资料:
  • 问题内容: 这是我的对象文字: 我如何添加字段与对象? 问题答案: 有两种向对象添加新 属性的 方法: 使用点表示法: 使用方括号表示法: 当您知道属性名称时,将使用第一种形式。动态确定属性名称时,使用第二种形式。像这个例子: 甲 真实 JavaScript数组可使用任一构造: 数组文字符号: 数组构造器符号:

  • 问题内容: 如果需要在列表中添加枚举属性,如何声明列表?让我们说枚举类是: 我想要做: 需要用什么代替 问题答案: 如果要使用字符串类型,请使用以下命令: 否则,MByD的答案

  • 问题内容: 这是我正在使用的 json对象 我希望将此作为另一个键值对: 我尝试了concat,但是使用||给了我结果 符号,我cdnt进行迭代。我用过溢漏,但只删除了逗号。 如何将密钥对值添加到现有的json对象?我正在使用JavaScript。 问题答案: 这是最简单的方法,对我有用。

  • 问题内容: 我想向中添加一个对象,但是每次我向具有3个属性的新对象添加时,都会出现错误。 在这里,我正在尝试创建其对象并将其传递给的类。 问题答案: 创建对象时需要使用运算符 要不然 并且您的构造函数不应包含。否则它将成为您班上的一个方法。

  • 问题内容: 我无法使用从常量中获取的枚举作为注释中的参数。我收到此编译错误:“注释属性[attribute]的值必须是枚举常量表达式”。 这是枚举代码的简化版本: 对于注释: 和班级: 该错误仅在方法B的“ theEnum = MYENUM_CONSTANT”中显示。字符串和int常量对于编译器是可以的,但Enum常量不是,即使它的值与methodA上的值完全相同。在我看来,这是编译器中缺少的功能

  • 问题内容: 我想知道在Java中是否可以嵌套枚举。 在这里,我想做的是: 拥有一个由CAT和DOG组成的物种,将允许我访问可用CAT和DOG品种的子枚举。例如,我希望能够测试是否装有CAT或DOG,以及动物是否是PERSAN CAT或PITBULL狗。CAT和DOG品种必须是不同的枚举,即CatBreeds枚举和DogBreeds枚举。 这是我要使用的访问模式的示例: 种类: 物种 种狗 品种: