将表示键值对的字符串转换为Map

Pet*_*Mmm 32 java dictionary

如何将String转换为Map:

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

预期产量:

HashMap{A=4, H=X, PO=87}
Run Code Online (Sandbox Code Playgroud)

Dan*_*lan 57

没有必要重新发明轮子.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);
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 好吧,它确实回答了问题(甚至包括图书馆要求)所以.. + 1.虽然我不完全确定依赖是否合理,如果*just*用于此任务. (4认同)
  • @tieTYT谢谢!我的班级路径中已经有番石榴了. (3认同)

Den*_*ret 21

您不需要库来执行此操作.您只需要使用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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,在现实生活中,与您的业务需求高度耦合的令牌和字符串的验证可能比您在此处看到的代码更重要.

  • +1是的.然后可以共享这样的方法以使其看起来像库. (3认同)
  • 你不需要一个库来做大多数事情.你在哪里划线? (2认同)

Mar*_*ace 17

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
    ));
Run Code Online (Sandbox Code Playgroud)

注意:假设没有重复.否则请查看第3个'mergeFunction'参数.


Den*_*nko 6

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;
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以将它用于不同类型的条目/键值分隔符,就像这样

Map<String, String> responseMap = splitToMap(response, " ", "=");
Run Code Online (Sandbox Code Playgroud)