2011-02-17 2 views
6

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

, например, позволяет сказать, что

key = Name & Target 
value = Permission(boolean) 

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

ответ

10

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

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

и MultiKeyMap:

multiKeyMap.put(key1, key2, value); 
+0

очень хорошая находка, thx. – IAdapter

1

Вы хотите что-то ищите?

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

map.put(key, value) 

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

+0

Это не может быть лучшим решением, name = 'ab' и target = 'c' будет указывать на ту же запись, что и имя = 'a' и target = 'bc'. Не идеальное решение, но эти строки могут быть разделены какой-то необычной строкой. –

5

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

+0

Пожалуйста, напишите рабочий пример предлагаемого решения, он может быть полезен для дальнейших ссылок – Deepak

3

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

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 
} 

Для создания d потребовалось около 30 секунд o в eclipse, это делает более безопасным и более безопасный код для более длительного использования в долгосрочной перспективе.

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

+0

Может подтвердить 30 секунд - вы вручную записываете имя пакета, имя класса и два атрибута, остальное автоматически генерируется eclipse (конструктор, getter, setter, реализация для hashcode, toString и equals). –

+0

занимает более 30 секунд, чтобы исправьте мой английский –

+1

Речь идет не о скорости, а о читаемости. MultiKey, Pair или просто List ничего не говорит о том, что фактически представляет этот ключ. И если вам нужно использовать эти две строки в качестве ключа, они, вероятно, имеют функциональное значение. В некоторых редких случаях даже полезно обернуть одно значение в тип значения только ради представления значения. –

Смежные вопросы