文字列をマップに変換するにはどうすればよいですか?
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}
文字列をマップに変換するにはどうすればよいですか?
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}
車輪の再発明をする必要はありません。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);
}
}
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'引数を調べます。
そのためにライブラリは必要ありません。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;
}
実際には、トークンと文字列の検証は、ビジネス要件と高度に関連しており、ここに表示されているコードよりもおそらく重要であることに注意してください。
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));
String props.getProperty(String)
メソッドも提供しますStringReader
8kバッファが組み込まれています(メガ入力でバッファリングを調整できます)new Properties(defaultsMap)
Properties
は、クラス内を確認することをお勧めします)。
!
、#
行頭にコメントがあります=
または:
キーと値の区切り文字です\
Unicode/特殊文字のエスケープ文字として使用されます。たとえば、次の文字列を準備することができますs = s.replace("\\", "\\\\");
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());
}
}