Подтвердить что ты не робот

Преобразование строки, представляющей пары ключ-значение в Map

Как преобразовать String в Map:

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

Ожидаемый результат:

HashMap{A=4, H=X, PO=87}
4b9b3361

Ответ 1

Нет необходимости изобретать велосипед. Библиотека Google Guava предоставляет Splitter класс.

Здесь вы можете использовать его вместе с некоторым тестовым кодом:

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);
    }

}

Ответ 2

Для этого вам не нужна библиотека. Вам просто нужно использовать StringTokenizer или String.split и перебрать маркеры для заполнения карты.

Импорт библиотеки плюс ее настройки будут почти такими же большими, как три строки кода, необходимые для этого. Например:

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;
}

Обратите внимание, что в реальной жизни проверка токенов и строки, в сочетании с требованиями вашего бизнеса, вероятно, будет более важна, чем код, который вы видите здесь.

Ответ 3

Java 8 на помощь!

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
    ));

ПРИМЕЧАНИЕ. Предполагая отсутствие дубликатов. В противном случае просмотрите третий аргумент mergeFunction.

Ответ 4

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;
}

И теперь вы можете использовать его для разных типов разделителей/ключей-значений, точно так же как

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

Ответ 5

разделите строку на ", затем разделите каждый элемент на" = "и поместите пары в карту. Зачем вам нужна" библиотека" для такой элементарной вещи?

Ответ 6

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;
}

Ответ 7

String elementType = StringUtility.substringBetween(elementValue.getElementType(), "{", "}");
Map<String, String>  eleTypeMap = new HashMap<String, String>();
StringTokenizer token = new StringTokenizer(elementType, ",");
while(token.hasMoreElements()){
    String str = token.nextToken();
    StringTokenizer furtherToken = new StringTokenizer(str,"=");
    while(furtherToken.hasMoreTokens()){
        eleTypeMap.put(furtherToken.nextToken(), furtherToken.nextToken());
    }
}