2016-11-29 8 views
1

私はこのような文字列を持っています:Java地図に複雑な文字列を格納する方法

ab1234「これは本です」; c56789、 'This is book 2'; d0123、 'これは本です3';

これは、第1要素と第2要素の間のキー値のペアです。要素自体はコンマで区切られ、各ペアはセミコロンで区切られています。

私がしようとしているのは、これらのペアをHashMapに配置することですが、Javaに精通しているわけではなく、ベストプラクティスが何であるかもあまりよく分かりません。

私はそれは、このように、配列に各部分をオンにすることを見てきました:

String[] arrayOne = complexString.split(";"); 
    String[] arrayTwo = arrayOne.split(","); 

誰かがこれを行うための最善の方法である助言してくださいことはできますか?

+0

'split'は文字列で機能します。文字列の配列ではありません。 2番目の分割をループで実行する必要があります。 – litelite

答えて

0

内部カンマやセミコロンに注意してください。次のコードはそれを行います。データは常に記述されているものであることを確認し、必要に応じてデータ内の一重引用符を取り除くために何かを行うかもしれません。

String[] arrayOne = complexString.split(";"); 
for(String str : arrayOne) { 
    String[] pair = str.split(","); 
    map.put(pair[0], pair[1]); 
} 
+0

返信いただきありがとうございます。だから、私はほとんどそこにいた。はい、私は単一引用符、カンマとセミコロンを追加しているReactアプリケーション経由でデータを渡しているので、データは説明どおりになります。したがって、私が助けることができる喜んでコンマまたはセミコロンは決して – Andy5

+0

@ Andy5ではありません。あなたの質問に答えるだけであれば、それを受け入れるかもしれません。 – selimssevgi

+0

明日の仕事に戻ってみる – Andy5

1

splitを呼び出すに基づくアプローチの問題は、セパレータは、引用符で囲まれた文字列内であるかどうか、あなたがなってしまいますので、例えば

ab1234, 'This ; is book 1'; c56789, 'This ; is, book 2'; 
//   ^      ^^

split機能は、気にしない、文字列の値に埋め込まれたセパレータでありますキーと値が壊れています。

幸いにも、この種の入力用のパーサーを書くことは、本当に簡単です。引用した領域の入力と終了に注意を払いながら、入力を文字単位でスキャンするだけです。

また、次のパターンに一致する正規表現を使用することができます。

\s*(?<key>[^,]+),\s*'(?<value>[^']*)'\s*; 

と収穫グループはそれから"key""value"と呼ばれる:

Pattern p = Pattern.compile("\\s*(?<key>[^,]+),\\s*'(?<value>[^']*)'\\s*;"); 
Matcher m = p.matcher(inputString); 
while (m.find()) { 
    String key = m.group("key"); 
    String val = m.group("value"); 
    ... 
} 

Demo.

0

私は正規表現のアプローチが好きこのような場合:

Map<String, String> map = new HashMap<String, String>(); 

String input = "ab1234, 'This is book 1'; c56789, 'This is book 2'; d0123, 'This is book 3';"; 

Matcher m = Pattern.compile("(.*?),(.*?);").matcher(input); 
while(m.find()) { 
    String key = m.group(1); 
    String value = m.group(2); 
    map.put(key.trim(), value.trim()); // trim optional 
} 

for(String key : map.keySet()) { 
    System.out.println("Key: " + key); 
    System.out.println("Value: " + map.get(key)); 
} 

それは印刷されます。

Key: ab1234 
Value: 'This is book 1' 
Key: c56789 
Value: 'This is book 2' 
Key: d
Value: 'This is book 3' 

あなたは、ループ内の最初のアレイ内の各文字列を分割する必要がある「値」

関連する問題