web-dev-qa-db-fra.com

Convertir une chaîne représentant des paires clé-valeur en mappage

Comment puis-je convertir une chaîne en une carte:

Map m = convert("A=4 H=X PO=87"); // What's convert?
System.err.println(m.getClass().getSimpleName()+m);

Production attendue:

HashMap{A=4, H=X, PO=87}
28
PeterMmm

Il n'est pas nécessaire de réinventer la roue. La bibliothèque Google Guava fournit la Splitter class .

Voici comment vous pouvez l'utiliser avec un code de test:

package com.sandbox;

import com.google.common.base.Splitter;
import org.junit.Test;

import Java.util.Map;

import static org.junit.Assert.assertEquals;

public class SandboxTest {

    @Test
    public void testQuestionInput() {
        Map<String, String> map = splitToMap("A=4 H=X PO=87");
        assertEquals("4", map.get("A"));
        assertEquals("X", map.get("H"));
        assertEquals("87", map.get("PO"));
    }

    private Map<String, String> splitToMap(String in) {
        return Splitter.on(" ").withKeyValueSeparator("=").split(in);
    }

}
54
Daniel Kaplan

Vous n'avez pas besoin d'une bibliothèque pour le faire. Vous devez simplement utiliser StringTokenizer ou String.split et parcourir les jetons pour remplir la carte.

L'importation de la bibliothèque plus ses paramètres seraient presque aussi gros que les trois lignes de code nécessaires pour le faire vous-même. Par exemple :

public static Map<String, String> convert(String str) {
    String[] tokens = str.split(" |=");
    Map<String, String> map = new HashMap<>();
    for (int i=0; i<tokens.length-1; ) map.put(tokens[i++], tokens[i++]);
    return map;
}

Notez que dans la vie réelle, la validation des jetons et de la chaîne, étroitement associée à vos besoins métier, serait probablement plus importante que le code que vous voyez ici.

19
Denys Séguret

Java 8 à la rescousse!

import static Java.util.stream.Collectors.*;

Map<String, String> result = Arrays.stream(input.split(" "))
    .map(s -> s.split("="))
    .collect(Collectors.toMap(
        a -> a[0],  //key
        a -> a[1]   //value
    ));

REMARQUE: en supposant qu'il n'y ait pas de doublons. Sinon, examinez le troisième argument 'mergeFunction'.

16
Gevorg
public static Map<String, String> splitToMap(String source, String entriesSeparator, String keyValueSeparator) {
    Map<String, String> map = new HashMap<String, String>();
    String[] entries = source.split(entriesSeparator);
    for (String entry : entries) {
        if (!TextUtils.isEmpty(entry) && entry.contains(keyValueSeparator)) {
            String[] keyValue = entry.split(keyValueSeparator);
            map.put(keyValue[0], keyValue[1]);
        }
    }
    return map;
}

Et maintenant, vous pouvez l'utiliser pour différents types d'entrées/séparateurs de valeurs-clés, comme ceci

Map<String, String> responseMap = splitToMap(response, " ", "=");
6
Denys Vasylenko

split String by "", puis divisez chaque élément par "=" et mettez les paires dans la carte. Pourquoi auriez-vous besoin de "bibliothèque" pour une telle chose élémentaire?

2
kachanov
private HashMap<String, String> convert(String str) {
    String[] tokens = str.split("&");
    HashMap<String, String> map = new HashMap<String, String>();
    for(int i=0;i<tokens.length;i++)
    {
        String[] strings = tokens[i].split("=");
        if(strings.length==2)
         map.put(strings[0], strings[1].replaceAll("%2C", ","));
    }

    return map;
}
0
Arun Shankar