【问题标题】:Java link two variables? [duplicate]Java链接两个变量? [复制]
【发布时间】:2015-01-24 20:48:08
【问题描述】:

寻找一个连接两个变量的方法。有点像哈希图,但键充当值和键。例如,我想跟踪两个人的对话。

    int recipient1ID = 1111;
    int recipient2ID = 2222; 

    LinkedVar<Integer, Integer> conversation = new LinkedVar<Integer, Integer>();

    conversation.put(recipient1ID, recipient2ID);// add link

    conversation.get(recipient1ID);// returns recipient2ID
    conversation.get(recipient2ID);// returns recipient1ID

我想调用一个变量并返回另一个。我希望这是有道理的。谢谢

【问题讨论】:

标签: java variables


【解决方案1】:

看看 Guava 的 BiMap - 这是一个可以满足您需求的双向地图。不过这个 api 看起来有点不同。

【讨论】:

    【解决方案2】:

    您想要的可以使用两个Maps 来实现,每个关系方向一个。

    Map<Integer, Integer> caller2recipient = ...;
    Map<Integer, Integer> recipient2caller = ...;
    

    聚合这两个映射,您可以将LinkedVar 类实现为:

    public class LinkedVar<T> {
    
        public LinkedVar() {
            fromto = new HashMap<T,T>();
            tofrom = new HashMap<T,T>();
        }
    
        public boolean put(T a, T b)
        {
            if(fromto.containsKey(a) || tofrom.containsKey(b))
                return false;
            fromto.put(a, b);
            tofrom.put(b, a);
            return true;
        }
    
        public T get(T key)   
        {
            for(Map<T,T> m: Arrays.asList(fromto, tofrom))
                if(m.containsKey(key)) return m.get(key);
            return null;
        }
    
        private Map<T,T> fromto;
        private Map<T,T> tofrom;
    
    }
    

    下面,您的示例中使用的此类:

        int recipient1ID = 1111;
        int recipient2ID = 2222; 
    
        LinkedVar<Integer> conversation = new LinkedVar<>();
        conversation.put(recipient1ID, recipient2ID);// add link
    
        System.out.println(conversation.get(recipient1ID));// returns recipient2ID
        System.out.println(conversation.get(recipient2ID));// returns recipient1ID
    

    请注意,正如 Guava 库中的 BiMap 类所做的那样,LinkedVar 可以使用两种类型(一种用于键,一种用于值)进行参数化,但这意味着必须将 get 拆分为两种方法不同的方法标识符

    • 得到
    • getReverse

    如果它们被同名标识:

    public S get(T key)   
    {
        if(fromto.containsKey(key)) return fromto.get(key);
        return null;
    }
    
    
    public T get(S key)   
    {
        if(tofrom.containsKey(key)) return tofrom.get(key);
        return null;
    }    
    

    对于TS 是同一类型的情况,Java 无法区分这两种方法。 事实上,Java 的编译器(与 G++ 不同)不允许定义该模板。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-11
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      相关资源
      最近更新 更多