您想要的可以使用两个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 拆分为两种方法不同的方法标识符:
如果它们被同名标识:
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++ 不同)不允许定义该模板。