41

如何将字符串转换为地图:

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

预期输出:

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

8 回答 8

60

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

}
于 2013-02-08T08:11:45.210 回答
27

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”参数。

于 2016-10-12T16:50:36.120 回答
23

你不需要图书馆来做到这一点。您只需要使用 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;
}

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

于 2013-02-08T08:07:18.993 回答
7
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, " ", "=");
于 2014-12-30T10:30:22.643 回答
4

用“”拆分字符串,然后用“=”拆分每个项目并将对放入映射中。为什么你需要“图书馆”来做这样基本的事情?

于 2013-02-08T08:07:45.837 回答
0
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;
}
于 2014-08-20T08:35:05.133 回答
0

当您在不同的行中有键值对时,让我针对特定情况提出另一种方法:使用 Java 的内置Properties类:

Properties props = new Properties();
props.load(new StringReader(s));

好处:

  • 短的
  • 适用于任何 Java 版本
  • 为您提供了一个现成的 Map<Object, Object> 还提供了方便的String props.getProperty(String)方法
  • StringReader具有内置 8k 缓冲区(您可以在兆输入上调整缓冲)
  • 对不同的换行符保持稳定
  • 您可以基于默认映射new Properties(defaultsMap)

警告(可能是美德或恶习):

  • 对“.properties”格式有特殊的解析规则(你可能想在Properties课堂上偷看以了解更多信息):
    • 从键/值中修剪空格/制表符
    • 具有特殊含义的字符:
      • !,#行首是注释
      • =或者:是键值分隔符
      • \用作 unicode/特殊字符的转义字符。例如,您可能希望使用s = s.replace("\\", "\\\\");
  • 生成的 Map 基于HashTable在大多数情况下不需要同步
于 2021-04-10T09:03:39.817 回答
-1
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());
    }
}
于 2015-01-30T04:47:01.963 回答