Java - Comment créer une nouvelle entrée( clé, valeur)


Je voudrais créer un nouvel élément similaire à Util.Map.Entry qui contiendra la structure key, value.

Le problème est que je ne peux pas instancier un Map.Entry parce que c'est une interface.

Quelqu'un sait-il comment créer un nouvel objet clé/valeur générique pour Map?Entrée?

Author: Eric Leschinski, 2010-06-24

9 answers

Vous pouvez simplement implémenter l'interface Map.Entry<K, V> vous-même:

import java.util.Map;

final class MyEntry<K, V> implements Map.Entry<K, V> {
    private final K key;
    private V value;

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

    @Override
    public K getKey() {
        return key;
    }

    @Override
    public V getValue() {
        return value;
    }

    @Override
    public V setValue(V value) {
        V old = this.value;
        this.value = value;
        return old;
    }
}

Puis utilisez-le:

Map.Entry<String, Object> entry = new MyEntry<String, Object>("Hello", 123);
System.out.println(entry.getKey());
System.out.println(entry.getValue());
 69
Author: Jesper, 2015-09-26 22:40:57

Il y a public static class AbstractMap.SimpleEntry<K,V>. Ne laissez pas la partie Abstract du nom vous induire en erreur: ce n'est en fait PAS une classe abstract (mais son niveau supérieur AbstractMap est).

Le fait que c'est une classe imbriquée static signifie que vous N'avez PAS besoin d'une instance AbstractMap englobante pour l'instancier, donc quelque chose comme ça compile bien:

Map.Entry<String,Integer> entry =
    new AbstractMap.SimpleEntry<String, Integer>("exmpleString", 42);

Comme indiqué dans une autre réponse, Goyave a aussi une commode static méthode de fabrique Maps.immutableEntry que vous pouvez utiliser.


Vous avez dit:

Je ne peux pas utiliser Map.Entry lui-même car apparemment c'est un objet en lecture seule que je ne peux pas instancier new instanceof

Ce n'est pas tout à fait exact. La raison pour laquelle vous ne pouvez pas l'instancier directement (c'est à dire avec new) parce que c'est un interface Map.Entry.


Mise en garde et astuce

Comme indiqué dans la documentation, AbstractMap.SimpleEntry est @since 1.6, donc si vous êtes coincé à 5.0, alors il n'est pas disponible pour vous.

Pour rechercher une autre classe connue qui implements Map.Entry, vous pouvez en fait aller directement au javadoc. À partir de la version Java 6

Carte d'interface.Entrée

Toutes les classes d'implémentation connues :

Malheureusement, la version1.5 ne répertorie aucune classe d'implémentation connue que vous pouvez utiliser, vous avez donc peut-être été bloqué avec l'implémentation de la vôtre.

 620
Author: polygenelubricants, 2016-12-05 22:01:24

Essayez Cartes.immutableEntry à partir de Goyave

Cela a l'avantage d'être compatible avec Java 5 (contrairement à AbstractMap.SimpleEntry qui nécessite Java 6.)

 39
Author: finnw, 2011-10-12 19:31:58

Exemple de AbstractMap.SimpleEntry:

import java.util.Map; 
import java.util.AbstractMap;
import java.util.AbstractMap.SimpleEntry;

Instancier:

ArrayList<Map.Entry<Integer, Integer>> arr = 
    new ArrayList<Map.Entry<Integer, Integer>>();

Ajouter les lignes:

arr.add(new AbstractMap.SimpleEntry(2, 3));
arr.add(new AbstractMap.SimpleEntry(20, 30));
arr.add(new AbstractMap.SimpleEntry(2, 4));

Extraire les lignes:

System.out.println(arr.get(0).getKey());
System.out.println(arr.get(0).getValue());
System.out.println(arr.get(1).getKey());
System.out.println(arr.get(1).getValue());
System.out.println(arr.get(2).getKey());
System.out.println(arr.get(2).getValue());

Doit imprimer:

2
3
20
30
2
4

C'est bon pour définir les arêtes des structures de graphes. Comme ceux entre les neurones dans votre tête.

 25
Author: Eric Leschinski, 2015-09-26 22:46:58

Pourquoi Map.Entry? Je suppose que quelque chose comme une paire clé-valeur est adapté au cas.

Utiliser java.util.AbstractMap.SimpleImmutableEntry ou java.util.AbstractMap.SimpleEntry

 12
Author: tanghao, 2013-11-26 07:40:31

org.apache.commons.lang3.tuple.Pair implémente java.util.Map.Entry et peut également être utilisé de façon autonome.

Comme d'autres l'ont mentionné, le com.google.common.collect.Maps.immutableEntry(K, V) de goyave fait l'affaire.

Je préfère Pair pour ses couramment Pair.of(L, R) syntaxe.

 4
Author: parxier, 2012-11-18 23:11:24

J'ai défini une classe de paire générique que j'utilise tout le temps. C'est génial. En prime, en définissant une méthode d'usine statique (Paire.créer) Je n'ai qu'à écrire les arguments de type moitié moins souvent.

public class Pair<A, B> {

    private A component1;
    private B component2;

    public Pair() {
            super();
    }

    public Pair(A component1, B component2) {
            this.component1 = component1;
            this.component2 = component2;
    }

    public A fst() {
            return component1;
    }

    public void setComponent1(A component1) {
            this.component1 = component1;
    }

    public B snd() {
            return component2;
    }

    public void setComponent2(B component2) {
            this.component2 = component2;
    }

    @Override
    public String toString() {
            return "<" + component1 + "," + component2 + ">";
    }

    @Override
    public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result
                            + ((component1 == null) ? 0 : component1.hashCode());
            result = prime * result
                            + ((component2 == null) ? 0 : component2.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;
            final Pair<?, ?> other = (Pair<?, ?>) obj;
            if (component1 == null) {
                    if (other.component1 != null)
                            return false;
            } else if (!component1.equals(other.component1))
                    return false;
            if (component2 == null) {
                    if (other.component2 != null)
                            return false;
            } else if (!component2.equals(other.component2))
                    return false;
            return true;
    }

    public static <A, B> Pair<A, B> create(A component1, B component2) {
            return new Pair<A, B>(component1, component2);
    }

}
 4
Author: Nels Beckman, 2018-09-20 13:52:06

Si vous utilisez Clojure, vous avez une autre option:

(defn map-entry
  [k v]
  (clojure.lang.MapEntry/create k v))
 3
Author: Radon Rosborough, 2016-07-19 16:44:16

À partir de Java 9, {[9] } il existe une nouvelle méthode utilitaire permettant de créer une entrée immuable qui est Map#entry(Object, Object).

Voici un exemple simple:

Entry<String, String> entry = Map.entry("foo", "bar");

Comme il est immuable, appeler setValue lancera un UnsupportedOperationException. Les autres limites sont le fait qu'il n'est pas sérialisable et null clé ou la valeur est interdit, si ce n'est pas acceptable pour vous, vous aurez besoin d'utiliser AbstractMap.SimpleImmutableEntry ou AbstractMap.SimpleEntry au lieu de cela.

 1
Author: Nicolas Filotto, 2018-09-20 13:58:49