EnumMap <Object,Set <x >>-如何为每个键具有唯一值

时间:2019-07-11 07:33:44

标签: java set enum-map

我正在尝试做这样的事情。

比方说我的EnumMap像这样的EnumMap<Animals, Set<Integer>>。 我有类似Dog类的键:FishCatAnimals。我想打印动物DogFishCat中的所有值。

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

如您所见,猫有2条来自狗,5条来自鱼。因此输出为:1,2,3,4,5,6,2,5,7

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

因此应类似于:1,2,3,4,5,6,7。添加所有值之后,我将无法过滤。我该怎么办?

1 个答案:

答案 0 :(得分: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]}

这不是非常优化和干净的方法,但是应该让您知道如何进行操作。