字符串到HashMap JAVA

Bis*_*han 24 java dictionary hashmap

我有一个Java属性文件,有一个KEYas ORDER.所以我在加载属性文件之后使用该方法检索它VALUE,如下所示:KEYgetProperty()

String s = prop.getProperty("ORDER");
Run Code Online (Sandbox Code Playgroud)

然后

s ="SALES:0,SALE_PRODUCTS:1,EXPENSES:2,EXPENSES_ITEMS:3";
Run Code Online (Sandbox Code Playgroud)

我需要从上面的字符串创建一个HashMap.SALES,SALE_PRODUCTS,EXPENSES,EXPENSES_ITEMS应该是KEYHashMap,0,1,2,3,应该是VALUEs的KEYs.

如果它很硬,看起来如下:

Map<String, Integer> myMap  = new HashMap<String, Integer>();
myMap.put("SALES", 0);
myMap.put("SALE_PRODUCTS", 1);
myMap.put("EXPENSES", 2);
myMap.put("EXPENSES_ITEMS", 3);
Run Code Online (Sandbox Code Playgroud)

KAR*_*ván 56

你可以用Guava的 Splitter.MapSplitter做到这一点:

Map<String, String> properties = Splitter.on(",").withKeyValueSeparator(":").split(inputString);
Run Code Online (Sandbox Code Playgroud)

  • 让我在番石榴中发现新东西的+1! (6认同)

Xav*_*ica 38

将该String.split()方法与,分隔符一起使用以获取对列表.迭代对并split()再次使用:分隔符来获取每对的键和值.

Map<String, Integer> myMap = new HashMap<String, Integer>();
String s = "SALES:0,SALE_PRODUCTS:1,EXPENSES:2,EXPENSES_ITEMS:3";
String[] pairs = s.split(",");
for (int i=0;i<pairs.length;i++) {
    String pair = pairs[i];
    String[] keyValue = pair.split(":");
    myMap.put(keyValue[0], Integer.valueOf(keyValue[1]));
}
Run Code Online (Sandbox Code Playgroud)

  • 使用foreach你可以保存一行!:) (5认同)

小智 22

在一行中:

HashMap<String, Integer> map = (HashMap<String, Integer>) Arrays.asList(str.split(",")).stream().map(s -> s.split(":")).collect(Collectors.toMap(e -> e[0], e -> Integer.parseInt(e[1])));
Run Code Online (Sandbox Code Playgroud)

细节:

1)拆分条目对并将字符串数组转换List<String>为使用java.lang.Collection.StreamAPIJava 1.8

Arrays.asList(str.split(","))
Run Code Online (Sandbox Code Playgroud)

2)将结果字符串列表映射"key:value"到字符串数组,其中[0]为键,[1]为值

map(s -> s.split(":"))
Run Code Online (Sandbox Code Playgroud)

3)使用collect流API中的终端方法进行变异

collect(Collector<? super String, Object, Map<Object, Object>> collector)
Run Code Online (Sandbox Code Playgroud)

4)使用Collectors.toMap()带有两个Function 的静态方法从输入类型到键和值类型执行变异.

toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper)
Run Code Online (Sandbox Code Playgroud)

其中T是输入类型,K是键类型,U是值类型.

5)继拉姆达变异StringString键和StringInteger价值

toMap(e -> e[0], e -> Integer.parseInt(e[1]))
Run Code Online (Sandbox Code Playgroud)



享受溪流和lambda风格Java 8. 没有更多的循环!

  • 这条"一条线"将给未来的维护者带来噩梦 (8认同)
  • 我可能会被标记,但我得说,圣洁的狗屎!我从来不知道Java是如此强大. (2认同)

Chi*_*moy 6

使用 Java 8:

Map<String, String> headerMap = Arrays.stream(header.split(","))
                    .map(s -> s.split(":"))
                    .collect(Collectors.toMap(s -> s[0], s -> s[1]));
Run Code Online (Sandbox Code Playgroud)


ius*_*ing 5

我建议使用com.fasterxml.jackson.databind.ObjectMapper(Maven repo 链接:https : //mvnrepository.com/artifact/com.fasterxml.jackson.core)像

final ObjectMapper mapper = new ObjectMapper();
Map<String, Object> mapFromString = new HashMap<>();
try {
    mapFromString = mapper.readValue(theStringToParse, new TypeReference<Map<String, Object>>() {
        });
} catch (IOException e) {
    LOG.error("Exception launched while trying to parse String to Map.", e);
}
Run Code Online (Sandbox Code Playgroud)