EnumMap<Object,Set<x>> - 如何为每个键设置唯一值
EnumMap<Object,Set<x>> - how to have unique values for every key
我正在尝试制作类似的东西。
假设我的 EnumMap
看起来像这样 EnumMap<Animals, Set<Integer>>
。
我有这样的键:Dog
、Fish
、Cat
来自 Animals
class。我想打印 Animals Dog
、Fish
和 Cat
.
的所有值
- 狗的值:- 1,2,3
- 鱼有值 - 4,5,6
- Cat 的值:- 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
。添加所有值后我无法稍后过滤。我该怎么做?
这应该有帮助:
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]}
这不是很优化和干净,但应该给你一个关于如何继续的想法。
我正在尝试制作类似的东西。
假设我的 EnumMap
看起来像这样 EnumMap<Animals, Set<Integer>>
。
我有这样的键:Dog
、Fish
、Cat
来自 Animals
class。我想打印 Animals Dog
、Fish
和 Cat
.
- 狗的值:- 1,2,3
- 鱼有值 - 4,5,6
- Cat 的值:- 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
。添加所有值后我无法稍后过滤。我该怎么做?
这应该有帮助:
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]}
这不是很优化和干净,但应该给你一个关于如何继续的想法。