簡體   English   中英

將表示鍵值對的字符串轉換為 Map

[英]Convert string representing key-value pairs to Map

如何將字符串轉換為地圖:

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}

沒有必要重新發明輪子。 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);
    }

}

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”參數。

你不需要圖書館來做到這一點。 您只需要使用 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;
}

請注意,在現實生活中,與您的業務需求高度相關的令牌和字符串的驗證可能比您在此處看到的代碼更重要。

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, " ", "=");

用“”分割字符串,然后用“=”分割每個項目並將成對放入地圖。 為什么你需要“圖書館”來做這種基本的事情?

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

當您在不同行中有鍵值對時,讓我針對特定情況提出另一種方法:使用 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("\\\\", "\\\\\\\\");准備您的字符串s = s.replace("\\\\", "\\\\\\\\");
  • 結果 Map 基於HashTable ,在大多數情況下不需要同步
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());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM