【问题标题】:A java collection that returns the invert of a value返回值反转的java集合
【发布时间】:2019-04-30 13:57:55
【问题描述】:

是否有按以下方式工作的集合:

//何时

value1 -> value2 
value3 -> value4

//这样

value2 is the opposite of value1
and
value4 is the opposite of value3

//那么 请求应按如下方式工作:

request in:value1 return out:value2
request in:value2 return out:value1

我想我可以用函数做到这一点,但想知道是否有专门的集合。

【问题讨论】:

  • value1 -> value2 是什么意思?我觉得这个问题不清楚。
  • 如果这只是您提前准备的数据,您可能只需创建一个 Map 并将条目放入对每对使用两个 put 操作。但如果你需要一个完整的 API,我相信你必须编写一个更全面的包装器。
  • 集合类和反转值有什么关系?

标签: java data-structures collections


【解决方案1】:

您似乎在寻找可逆映射。已经对此进行了一些详细的讨论:Java invert map

之前讨论的其中一个链接指向 Apache 解决方案:https://commons.apache.org/proper/commons-collections/javadocs/api-3.2.2/org/apache/commons/collections/BidiMap.html

虽然 java 没有有效处理此问题的集合类型,但您可以通过将两个映射放在一起来自己制作一个:

public class BiDiMap<T1, T2> {
    private final Map<T1, T2> forwardMap = new HashMap<T1, T2>();
    private final Map<T2, T1> reverseMap = new HashMap<T2, T1>();

    public void put(T1 t1, T2 t2) {
        T2 oldT2 = forwardMap.put(t1, t2);
        T1 oldT1 = reverseMap.put(t2, t1);
    }
    public void remove(T1 t1, T2 t2) {
        T2 currentT2 = forwardMap.get(t1);
        if ( currentT2 != t2 ) {
            // This is an error.
        }
        T1 currentT1 = reverseMap.get(t2);
        if ( currentT1 != t1 ) {
            // Also an error.
        }
        forwardMap.remove(t1);
        reverseMap.remove(t2);
    }
    public T2 getForward(T1 t1) {
        return forwardMap.get(t1);
    }
    public T1 getReverse(T2 t2) {
        return reverseMap.get(t2);
    }
}

等等。

这假设映射是一对一的。如果映射是一对多、多对一或多对多,则实现是不同的。

【讨论】:

    猜你喜欢
    • 2016-03-29
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    相关资源
    最近更新 更多