2010-06-04 5 views
184

Je cherche une classe KeyValuePair en Java.
Étant donné que java.util utilise beaucoup d'interfaces, aucune implémentation concrète n'est fournie, seule l'interface Map.Entry.Un KeyValuePair en Java

Y a-t-il une implémentation canonique que je peux importer? C'est l'une de ces classes de "programmation de plombiers" que je déteste implémenter 100x fois.

+3

Je recommande d'utiliser une classe générique KeyValuePair. Il est préférable de définir une classe spécifique au domaine avec des accesseurs plus informatifs (par exemple, getProductId(), getProductPrice()). – Adamski

+19

@Adamski: Je ne suis pas d'accord. Nous n'utilisons pas de classes 'Map' ou' List' spécifiques au domaine, pourquoi cela devrait-il être différent? Un KeyValuePair est juste une carte avec une entrée. – skaffman

+3

@skaffman: Juste point, mais je pense que le concept d'une paire générique est plus facile à abuser que de faire passer des collections. Par exemple, si quelqu'un veut renvoyer deux valeurs d'une méthode, il est tentant de renvoyer une paire mais généralement cela indique un problème de conception sous-jacent (par exemple, pourquoi X et Y ne sont-ils pas unifiés de toute façon dans le modèle de domaine s'ils sont intrinsèquement liés?) – Adamski

Répondre

205

AbstractMap.SimpleEntry est générique et peut être utile.

+9

... ou AbstractMap.SimpleImmutableEntry, le cas échéant. – karmakaze

+0

Donc, je devrais utiliser 'List ' correct? – George

+0

Mieux utiliser AbstractMap.SimpleEntry/AbstractMap.SimpleImmutableEntry comme base pour votre propre classe, spécifique au domaine, être OO. Dans le cas le plus simple, il s'agit juste de donner un nouveau nom à la classe et aux deux éléments. – foo

85

programmeurs Android pourraient utiliser BasicNameValuePair

Mise à jour:

BasicNameValuePair est maintenant dépréciée (API 22). Utilisez plutôt Pair.

Exemple d'utilisation:

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

Ce n'est pas seulement pour les programmeurs Android, c'est n'importe quel programme Java. – Cody

+3

@ doctor-oreo oui n'importe quel programmeur java pourrait télécharger pot de [hc.apache.org] (http://hc.apache.org/) mais Android a ces ** construit en ** – kreker

+32

En fait pour les utilisateurs d'Android, un bon le choix est [android.util.Pair] (http://developer.android.com/reference/android/util/Pair.html). – chhabrakadabra

33

La classe Pair de Lang Commons pourrait aider:

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

Bien sûr, vous devez inclure commons-lang.

+0

L'url ne fonctionne pas –

+5

change d'URL de temps en temps. J'ai googlé Pair Commons Lang "et l'ai trouvé.J'ai enlevé le lien pour empêcher d'autres 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

Utilisation de javafx.util.Pair est suffisant pour la plupart simples appariements Key-valeur des deux types qui peuvent être instanciés.

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

Ceci est disponible dans Android (Support Library), aussi – Thommy

+1

Il n'est pas disponible dans le serveur JDK (headless) ou à partir de Java 1.9 – foo

0

Mon préféré est

HashMap<Type1, Type2> 

Tout ce que vous devez faire est de spécifier le type de données de la clé pour Type1 et le type de données pour la valeur de type2. C'est l'objet clé-valeur le plus commun que j'ai vu en Java.

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

+1

Vous semblez avoir manqué une partie de ses qualifications dans cette question.Une collection ne correspond pas au besoin d'un seul paire de valeurs clés Il mentionne le type d'entrée de Map unique, 'Map.Entry ' mais il voulait un cas plus général, mais ce type peut être instancié directement, voir nswer: http://stackoverflow.com/a/3110563/3251909 – AaronCarson

Questions connexes