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}
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);
}
}
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.
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'.
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, " ", "=");
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?
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;
}