2010-06-04 3 views
184

Я ищу класс KeyValuePair в Java.
Поскольку java.util сильно использует интерфейсы, нет конкретной реализации, только интерфейс Map.Entry.KeyValuePair в Java

Есть ли какая-то каноническая реализация, которую я могу импортировать? Это один из тех классов программирования «сантехников», которых я ненавижу в 100 раз.

+3

Я бы рекомендовал не использовать общий класс KeyValuePair. Гораздо лучше определить класс, специфичный для домена, с более информативными аксессуарами (например, getProductId(), getProductPrice()). – Adamski

+19

@ Адамски: Я не согласен. Мы не используем специфичные для домена классы «Карта» или «Список», почему это должно быть иначе? KeyValuePair - это всего лишь карта с одной записью. – skaffman

+3

@ skaffman: Справедливая точка, но я думаю, что концепция родовой пары легче открыть для злоупотребления, чем прохождение Коллекций вокруг. Например, если кто-то хочет вернуть два значения из метода, возникает соблазн вернуть пар , но обычно это указывает на проблему с базовым дизайном (например, почему X и Y никоим образом не объединены в модели домена, если они связанный с этим?) – Adamski

ответ

205

AbstractMap.SimpleEntry является общим и может пригодиться.

+9

... или AbstractMap.SimpleImmutableEntry, если необходимо. – karmakaze

+0

Так что я должен использовать 'List ' правильно? – George

+0

Лучшее использование AbstractMap.SimpleEntry/AbstractMap.SimpleImmutableEntry в качестве базы для вашего собственного, специфичного для домена класса, для OO. В самом простом случае это просто дает новое имя классу и двум элементам. – foo

85

Android программисты могут использовать BasicNameValuePair

Обновление:

BasicNameValuePair теперь устаревшее (API 22). Вместо этого используйте Pair.

Пример использования:

Pair<Integer, String> simplePair = new Pair<>(42, "Second"); 
Integer first = simplePair.first; // 42 
String second = simplePair.second; // "Second" 
+5

Это не только для Android-программистов, это любая java-программа. – Cody

+3

@ doctor-oreo да какой-либо java-программист может загрузить jar с [hc.apache.org] (http://hc.apache.org/), но у android есть те ** встроенные ** – kreker

+32

На самом деле для пользователей Android, хороший выбор - [android.util.Pair] (http://developer.android.com/reference/android/util/Pair.html). – chhabrakadabra

33

Пара класс от Commons Lang может помочь:

Pair<String, String> keyValue = new ImmutablePair("key", "value"); 

Конечно, вам нужно будет включить Викисклада Ланга.

+0

URL-адрес не работает –

+5

url изменяется время от времени. Я нашел ссылку, чтобы предотвратить дальнейшие downvotes :-( – remipod

+2

'android.util.Pair' – Arvin

8
import java.util.Map; 

public class KeyValue<K, V> implements Map.Entry<K, V> 
{ 
    private K key; 
    private V value; 

    public KeyValue(K key, V value) 
    { 
     this.key = key; 
     this.value = value; 
    } 

    public K getKey() 
    { 
     return this.key; 
    } 

    public V getValue() 
    { 
     return this.value; 
    } 

    public K setKey(K key) 
    { 
     return this.key = key; 
    } 

    public V setValue(V value) 
    { 
     return this.value = value; 
    } 
} 
10

Использование javafx.util.Pair достаточно для большинства простых пар ключ-значение любых двух типов, которые могут быть созданы.

Pair<Integer, String> myPair = new Pair<>(7, "Seven"); 
Integer key = myPair.getKey(); 
String value = myPair.getValue(); 
+2

Это доступно в Android (Библиотека поддержки). – Thommy

+1

Он недоступен на сервере JDK (без головы) или с Java 1.9. – foo

0

Мой любимый

HashMap<Type1, Type2> 

Все, что вам нужно сделать, это указать тип данных для ключа для Type1 и тип данных для значения для типа 2. Это самый распространенный объект ключевого значения, который я видел в Java.

https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

+1

Вы, кажется, пропустили часть своих квалификаций в этом вопросе. Коллекция не подходит для одного key value. Он упоминает тип одиночной записи в карте, «Map.Entry », но хотел более общий случай. Этот тип может быть создан непосредственно, хотя, см. это nswer: http://stackoverflow.com/a/3110563/3251909 – AaronCarson