1646 votes

Comment initialiser une table de hachage (au sens propre)?

Est-il un moyen d'initialisation d'un Java HashMap comme ça?:

Map<String,String> test = 
    new HashMap<String, String>{"test":"test","test":"test"};

Quelle serait la syntaxe correcte? Je n'ai rien trouvé à ce sujet. Est-ce possible? Je suis à la recherche de la plus courte/fastet façon de mettre un peu "final/statique" des valeurs dans une carte qui ne changent jamais et ils sont connus à l'avance quand crerating la Carte.

2156voto

yankee Points 6587

Non, vous devez ajouter tous les éléments manuellement. Vous pouvez utiliser un initialiseur statique:

public class Demo
{
    private static final Map<String, String> myMap;
    static
    {
        myMap = new HashMap<String, String>();
        myMap.put("a", "b");
        myMap.put("c", "d");
    }
}

1164voto

gregory561 Points 2555

C'est une façon.

    HashMap<String, String > h = new HashMap<String, String>(){{
        put("a","b");
    }};

Cependant, vous devez être prudent et assurez-vous de comprendre le code ci-dessus (il crée une nouvelle classe qui hérite de table de hachage). Par conséquent, vous devriez lire plus ici: http://www.c2.com/cgi/wiki?DoubleBraceInitialization ou tout simplement utiliser la Goyave:

Map<String, Integer> left = ImmutableMap.of("a", 1, "b", 2, "c", 3);

371voto

Jens Hoffmann Points 1468

Avec la goyave vous pouvez faire ceci:

Map<String,String> test = ImmutableMap.of("k1", "v1", "k2", "v2");

(juste par souci d'exhaustivité, si vous le permettez 3ème partie libs)

122voto

Paŭlo Ebermann Points 35526

Il n'y a pas de moyen direct pour ce faire, Java n'a pas de Carte littéraux (encore - je pense qu'ils ont été proposées pour Java 8).

Certaines personnes comme ceci:

Map<String,String> test = new HashMap<String, String>(){{
       put("test","test"); put("test","test");}};

Cela crée un anonyme sous-classe de la table de hachage, dont l'instance de l'initialiseur met ces valeurs. (En passant, une carte ne peut pas contenir deux fois la même valeur, votre deuxième mettre remplacera le premier. Je vais utiliser des valeurs différentes pour les exemples suivants.)

La façon normale, ne serait-ce (pour une variable locale):

Map<String,String> test = new HashMap<String, String>();
test.put("test","test");
test.put("test1","test2");

Si votre test carte est une variable d'instance, mettre l'initialisation dans le constructeur ou l'instance de l'initialiseur:

Map<String,String> test = new HashMap<String, String>();
{
    test.put("test","test");
    test.put("test1","test2");
}

Si votre test carte est une variable de classe, mettre l'initialisation dans un initialiseur statique:

static Map<String,String> test = new HashMap<String, String>();
static {
    test.put("test","test");
    test.put("test1","test2");
}

Si vous voulez que votre carte ne change jamais, vous devriez après l'initialisation de l'enveloppe de votre carte en Collections.unmodifiableMap(...). Vous pouvez le faire dans un initialiseur statique:

static Map<String,String> test;
{
    Map<String,String> temp = new HashMap<String, String>();
    temp.put("test","test");
    temp.put("test1","test2");
    test = Collections.unmodifiableMap(temp);
}

(Je ne suis pas sûr si vous pouvez maintenant faire de la test final ... l'essayer et de signaler ici.)

46voto

Aerthel Points 181

Une alternative, à l'aide de la plaine de Java 7 classes et varargs: créer une classe HashMapBuilder avec cette méthode:

public static HashMap<String, String> build(String... data){
    HashMap<String, String> result = new HashMap<String, String>();

    if(data.length % 2 != 0) 
        throw new IllegalArgumentException("Odd number of arguments");      

    String key = null;
    Integer step = -1;

    for(String value : data){
        step++;
        switch(step % 2){
        case 0: 
            if(value == null)
                throw new IllegalArgumentException("Null key value"); 
            key = value;
            continue;
        case 1:             
            result.put(key, value);
            break;
        }
    }

    return result;
}

Utiliser la méthode comme ceci:

HashMap<String,String> data = HashMapBuilder.build("key1","value1","key2","value2");

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