Java связывает две переменные? [Дубликат]

1

Ищете ссылку, чтобы связать две переменные. вроде как 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

Я хочу вызвать одну переменную, и она возвращает другую. Я надеюсь в этом есть смысл. благодаря

Теги:
variables

2 ответа

1
Лучший ответ

То, что вы хотите, может быть реализовано с использованием двух 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 должен быть разделен на два метода с разными идентификаторами метода:

  • получить
  • 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;
}    

Java не может отличить оба метода для тех случаев, когда T и S являются одним и тем же типом. На самом деле компилятор Java (в отличие от G++) не позволит дефинировать этот шаблон.

2

Посмотрите на Guava BiMap - это двунаправленная карта, которая может удовлетворить ваши потребности. Апи выглядит немного по-другому.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню