寻找离开链接两个变量。有点像散列图,但键作为值和键。例如,我想跟踪两个人进行对话。
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
我想调用一个变量,然后返回另一个变量。我希望这是有道理的。感谢
答案 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
必须使用不同的方法标识符分成两种方法:
如果它们用同一名称标识:
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;
}
对于T
和S
属于同一类型的情况,Java无法区分这两种方法。
事实上,Java的编译器(与G ++相反)不允许定义该模板。