259 votes

Une paire clé-valeur en Java

Je suis à la recherche d'une classe KeyValuePair en Java.
Comme java.util utilise beaucoup les interfaces, aucune implémentation concrète n'est fournie, seulement l'interface Map.Entry.

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

4 votes

Je vous déconseille d'utiliser une classe KeyValuePair générique. Il vaut mieux définir une classe spécifique au domaine avec des accesseurs plus informatifs (par exemple, getProductId(), getProductPrice()).

25 votes

@Adamski : Je ne suis pas d'accord. Nous n'utilisons pas d'outils spécifiques au domaine Map o List classes, pourquoi cela devrait-il être différent ? Une KeyValuePair est simplement une Map avec une entrée.

4 votes

@skaffman : Bon point, mais je pense que le concept d'un Pair générique est plus facilement ouvert à l'abus que de passer des Collections autour. Par exemple, si quelqu'un veut renvoyer deux valeurs à partir d'une méthode, il est tentant de renvoyer une Paire<X,Y> mais cela indique généralement un problème de conception sous-jacent (par exemple, pourquoi X et Y ne sont pas unifiés d'une manière ou d'une autre dans le modèle de domaine s'ils sont intrinsèquement liés ?)

10voto

J'aime utiliser

Propriétés

Exemple :

Properties props = new Properties();

props.setProperty("displayName", "Jim Wilson"); // (key, value)

String name = props.getProperty("displayName"); // => Jim Wilson

String acctNum = props.getProperty("accountNumber"); // => null

String nextPosition = props.getProperty("position", "1"); // => 1

Si vous êtes familier avec une table de hachage, vous serez déjà familier avec ceci

0 votes

Les propriétés sont basées sur une table de hachage, et pour une simple paire, une table de hachage est probablement trop coûteuse.

0 votes

Tant que tout ce dont vous avez besoin est <String, String> Les propriétés sont la meilleure classe OTS. Si vous avez besoin de <String,Object> alors il est préférable de remonter la chaîne pour trouver une meilleure solution.

5voto

Mohhamed Nabil Points 1218

Vous pouvez créer facilement votre propre classe KeyValuePair.

public class Key<K, V>{

    K key;
    V value;

    public Key() {

    }

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

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

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

}

4voto

fuelusumar Points 56

Pour Android et les requêtes http, j'utilise NameValuePair provient du paquet org.apache.http

1voto

Matthew Park Points 782

Mon préféré est

HashMap<Type1, Type2>

Il suffit de spécifier le type de données de la clé pour le Type1 et le type de données de la valeur pour le Type2. C'est l'objet clé-valeur le plus courant que j'ai vu en Java.

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

2 votes

Vous semblez avoir manqué une partie de ses qualifications dans cette question. Une collection ne répond pas au besoin d'une seule paire clé-valeur. Il mentionne le type d'entrée unique de la carte, Map.Entry<K,V> mais voulait un cas plus général. Ce type peut cependant être instancié directement, voir cette réponse : stackoverflow.com/a/3110563/3251909

0 votes

Le gros problème avec ceci est que hashmap ne préserve pas l'ordre.

-1voto

Garret Wilson Points 2583

J'ai publié un NameValuePair classe dans La bibliothèque centrale de GlobalMentor disponible dans Maven. Il s'agit d'un projet en cours avec une longue histoire, alors n'hésitez pas à soumettre toute demande de modification ou d'amélioration.

0 votes

Quelqu'un peut-il expliquer pourquoi il a été baissé ? L'OP a demandé une classe de paire nom-valeur. J'ai fourni une option. Peut-être que la mienne n'est pas votre préférée, mais en quoi est-elle moins digne d'être incluse ici que celle des autres bibliothèques indiquées dans les autres réponses ? (Notez que je viens toutefois de mettre à jour les liens, car l'un d'entre eux était cassé en raison du remaniement du dépôt).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X