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

車輪の再発明をする必要はありません。GoogleGuavaライブラリは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
    ));

注:重複がないと仮定します。それ以外の場合は、3番目の'mergeFunction'引数を調べます。

于 2016-10-12T16:50:36.120 に答える
23

そのためにライブラリは必要ありません。StringTokenizerまたはString.splitを使用し、トークンを反復処理してマップを埋める必要があります。

ライブラリとその設定のインポートは、自分で行うために必要な3行のコードとほぼ同じ大きさになります。例えば ​​:

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)メソッドも提供します
  • StringReader8kバッファが組み込まれています(メガ入力でバッファリングを調整できます)
  • さまざまな改行文字に対して安定
  • デフォルトのマップに基づいてnew Properties(defaultsMap)

警告(美徳または悪徳である可能性があります):

  • '.properties'形式の特別な解析ルールがあります(詳細についてPropertiesは、クラス内を確認することをお勧めします)。
    • キー/値からスペース/タブをトリミングします
    • 特別な意味の文字があります:
      • !#行頭にコメントがあります
      • =または:キーと値の区切り文字です
      • \Unicode/特殊文字のエスケープ文字として使用されます。たとえば、次の文字列を準備することができますs = s.replace("\\", "\\\\");
  • 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 に答える