在 Java 中使用 AND (&&) 关系进行映射

Mapping with an AND (&&) relationship in Java

我正在阅读 Guava 中的 MultiMap。它说可以映射以下关系:

是否可以仅使用 POJO 在 Java/Guava 中使用映射结构来映射以下关系?

这是我特别感兴趣的倒数第二个关系。单独 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'),分别代表cc && 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 中适当地实现了 equalshashCode,这样具有相同符号的两个实例被认为是相等的,例如

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。