Java链接两个变量?

时间:2014-11-26 13:34:28

标签: java variables

寻找离开链接两个变量。有点像散列图,但键作为值和键。例如,我想跟踪两个人进行对话。

    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

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

2 个答案:

答案 0 :(得分:2)

看看番石榴的BiMap - 这是一张双向地图,可以满足您的需求。 api虽然看起来有点不同。

答案 1 :(得分:1)

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

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 ++相反)不允许定义该模板。