Ищете ссылку, чтобы связать две переменные. вроде как hashmap, но где ключ действует как значение и ключ. например, я хочу отслеживать двух человек, имеющих беседу.
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
Я хочу вызвать одну переменную, и она возвращает другую. Я надеюсь в этом есть смысл. благодаря
То, что вы хотите, может быть реализовано с использованием двух Map
s, по одному для каждого направления отношений.
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
Обратите внимание, что, поскольку класс BiMap
из библиотеки Guava делает, 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;
}
Java не может отличить оба метода для тех случаев, когда T
и S
являются одним и тем же типом. На самом деле компилятор Java (в отличие от G++) не позволит дефинировать этот шаблон.
Посмотрите на Guava BiMap - это двунаправленная карта, которая может удовлетворить ваши потребности. Апи выглядит немного по-другому.
HashMap
?