在 Java 中使用 AND (&&) 关系进行映射
Mapping with an AND (&&) relationship in Java
我正在阅读 Guava 中的 MultiMap。它说可以映射以下关系:
- a → 1, 2
- b → 3
是否可以仅使用 POJO 在 Java/Guava 中使用映射结构来映射以下关系?
- a → 1, 2
- b → 3
- c → 3
- d → 4
- c && d → 5
- f → 5
这是我特别感兴趣的倒数第二个关系。单独 c 会给出 3。单独 d 会给出 4。在这种情况下,c 和 d 一起会 return 3、4 和 5。
这是如何实现的?
更新: 理想情况下,我希望在示例中使用 a、c 和 d 进行搜索以给出结果 1、2、3、4 和 5。意图将使映射可扩展到数百个键、数百个值和数百个这样的 AND 关系。
我希望使用 Set 进行搜索,结果是一个 Set。
您可以将键设为某种采用符号列表的值类型,例如new AndKey('c')
、new AndKey('c', 'd')
,分别代表c
和c && d
,然后将这些键的值插入到multimap中:
ImmutableMultimap<AndKey, Integer> map = ImmutableMultimap.builder()
.put(new AndKey('c'), 3)
.put(new AndKey('d'), 4)
.put(new AndKey('c', 'd'), 3)
.put(new AndKey('c', 'd'), 4)
.put(new AndKey('c', 'd'), 5)
.build();
这假设您在 AndKey
中适当地实现了 equals
和 hashCode
,这样具有相同符号的两个实例被认为是相等的,例如
class AndKey {
private final ImmutableList<Character> symbols;
AndKey(Character... symbols) { this.symbols = ImmutableList.copyOf(symbols); }
@Override int hashCode() { return symbols.hashCode(); }
@Override boolean equals(Object obj) {
if (obj == this) { return true; }
if (obj instanceof AndKey) { return symbols.equals(((AndKey) obj).symbols); }
return false;
}
当然也可以使用 AutoValue。
我正在阅读 Guava 中的 MultiMap。它说可以映射以下关系:
- a → 1, 2
- b → 3
是否可以仅使用 POJO 在 Java/Guava 中使用映射结构来映射以下关系?
- a → 1, 2
- b → 3
- c → 3
- d → 4
- c && d → 5
- f → 5
这是我特别感兴趣的倒数第二个关系。单独 c 会给出 3。单独 d 会给出 4。在这种情况下,c 和 d 一起会 return 3、4 和 5。
这是如何实现的?
更新: 理想情况下,我希望在示例中使用 a、c 和 d 进行搜索以给出结果 1、2、3、4 和 5。意图将使映射可扩展到数百个键、数百个值和数百个这样的 AND 关系。
我希望使用 Set 进行搜索,结果是一个 Set。
您可以将键设为某种采用符号列表的值类型,例如new AndKey('c')
、new AndKey('c', 'd')
,分别代表c
和c && d
,然后将这些键的值插入到multimap中:
ImmutableMultimap<AndKey, Integer> map = ImmutableMultimap.builder()
.put(new AndKey('c'), 3)
.put(new AndKey('d'), 4)
.put(new AndKey('c', 'd'), 3)
.put(new AndKey('c', 'd'), 4)
.put(new AndKey('c', 'd'), 5)
.build();
这假设您在 AndKey
中适当地实现了 equals
和 hashCode
,这样具有相同符号的两个实例被认为是相等的,例如
class AndKey {
private final ImmutableList<Character> symbols;
AndKey(Character... symbols) { this.symbols = ImmutableList.copyOf(symbols); }
@Override int hashCode() { return symbols.hashCode(); }
@Override boolean equals(Object obj) {
if (obj == this) { return true; }
if (obj instanceof AndKey) { return symbols.equals(((AndKey) obj).symbols); }
return false;
}
当然也可以使用 AutoValue。