Ключ для двух строк на карте? - PullRequest
6 голосов
/ 17 февраля 2011

Мне нужно создать карту с ключом из двух строк.

например, скажем,

key = Name & Target
value = Permission(boolean)

Нужно ли создавать специальный объект или есть какая-то сборка вкортеж в Java / Google Collections или Commons Collections или Commons Lang?

Ответы [ 4 ]

11 голосов
/ 17 февраля 2011

Коллекции Apache Commons имеют MultiKey :

map.put(new MultiKey(key1, key2), value);

и MultiKeyMap :

multiKeyMap.put(key1, key2, value);
5 голосов
/ 17 февраля 2011

почему бы вам не создать List из этих двух строк и использовать в качестве ключа Map. Это также сделает код более читабельным.

3 голосов
/ 17 февраля 2011

Вы можете связать строки вместе, но я предпочитаю создать небольшой объект значения:

public class NameTarget {
    private final String name;
    private final String target;

    public NameTarget(String name, String target){
        this.name = name;
        this.target = target;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + ((target == null) ? 0 : target.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        NameTarget other = (NameTarget) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (target == null) {
            if (other.target != null)
                return false;
        } else if (!target.equals(other.target))
            return false;
        return true;
    }

    // add getters here
}

Потребовалось около 30 секунд, чтобы сгенерировать do в eclipse, что делает более безопасный и понятный код для работы в долгосрочной перспективе.

Вы могли и я в прошлом создали терле в стиле Pair, но я начинаю предпочитать именованные типы неизменяемых значений для такого рода вещей.

1 голос
/ 17 февраля 2011

Это то, что вы ищете?

String name = ...
String target = ...
String key = name + "_" + target;

map.put(key, value)

В качестве альтернативы вы можете создать объект, содержащий две строки и переопределить подпрограммы hashCode и equals, чтобы отличать их лучше, чем простая конкатенация строк.

...