-3

我正在尝试制作这样的东西。

假设我的EnumMap样子是这样的EnumMap<Animals, Set<Integer>>。我有像:Dog, Fish,类Cat的键Animals。我想打印 AnimalsDogFish的所有值Cat

  • 狗的价值: - 1,2,3
  • 鱼有值 - 4,5,6
  • 猫的价值:- 2,5,7

如您所见,Cat 有 2 个来自 Dog,5 个来自 Fish。所以输出将是:1,2,3,4,5,6,2,5,7.

我想在向 EnumMap 添加过程期间删除重复项。

所以它应该是这样的:1,2,3,4,5,6,7. 添加所有值后,我无法稍后过滤。我怎样才能做到这一点?

4

1 回答 1

1

这应该有助于:

public class Test {

    private Map<Animal, Set<Integer>> m = new EnumMap<>(Animal.class);

    public Test() {
        m.put(Animal.DOG, Set.of(1, 2, 3));
        m.put(Animal.FISH, Set.of(4, 5, 6));
    }

    public static void main(String[] args) {
        Test t = new Test();
        t.addValueIfNotPresent(Animal.CAT, 2);
        t.addValueIfNotPresent(Animal.CAT, 5);
        t.addValueIfNotPresent(Animal.CAT, 7);

        System.out.println(t.m);
    }

    private void addValueIfNotPresent(Animal key, Integer value) {
        if (m.values().stream().flatMap(Collection::stream).noneMatch(value::equals)) {
            m.compute(key, (animal, integers) -> {
                if (Objects.isNull(integers)) {
                    Set<Integer> s = new HashSet<>();
                    s.add(value);
                    return s;
                } else {
                    integers.add(value);
                    return integers;
                }
            });
        }
    }

    enum Animal {DOG, CAT, FISH}
}

输出

{DOG=[3, 2, 1], CAT=[7], FISH=[4, 6, 5]}

这不是很优化和干净,但应该让您了解如何进行。

于 2019-07-11T08:03:15.917 回答