2016-07-09 11 views
0

Listおよびhashmapを使用してJson配列オブジェクトを作成したいが、プログラム実行中に奇妙な問題に直面している。Listおよびハッシュマップを使用してJava Json配列オブジェクトを作成中に出力エラーが発生する

これは私のコードです:

List<HashMap> list = new ArrayList<>(); 
HashMap<String, String> hmap = new HashMap<>(); 
String raw = "<CONTENT><DETAIL><USER>user1</USER><MAIL>[email protected]</MAIL></DETAIL><DETAIL><USER>user2</USER><MAIL>[email protected]</MAIL></DETAIL></CONTENT>"; 
String partRas = ""; 
int index = raw.indexof("<USER>"); 

while(index >= 0) { 
    if(index + 50 < raw.length()) 
     partRaw = raw.subString(index, index + 50); 

    hmap("user", getTagValue(partRaw, "USER")); 
    hmap("email", getTagValue(partRaw, "MAIL")); 
    list.add(hmap); 

    raw = raw.subString(index + 50, raw.length()); 
    index = raw.indexof("<USER>"); 
} 

System.out.println(new Gson().toJson(list)); 


public static String getTagValue(String xml, String tagName){ 
    return xml.split("<"+tagName+">")[1].split("</"+tagName+">")[0]; 
} 

このコードは合法的に見えますが、私はこのコードを実行したときに、私は、このような結果を持つことが期待された。

[{"user":"user1","email":"[email protected]"},{"user":"user2","email":"[email protected]"}] 

しかし、私が得たことはありますこの:

[{"user":"user2","email":"[email protected]"},{"user":"user2","email":"[email protected]"}] 

私が把握でき、この問題に対する唯一の答えは "であることがPASS BYでありますADDRESS "であるため、Listにプッシュされた最初の結果は2番目の反復の影響を受けました。

質問:質問したい質問:誰かが私が望む結果を得る方法を知っていますか?

生データに「USER」と「MAIL」のデータができるだけ多く含まれる可能性があるため、初めに複数のHashMapを定義するように答えてもらえません。

+0

このコードは、[MCVE]ではありません。特に 'map'がどこに定義されているかは示していません。私が推測するつもりなら、それはあなたの問題です。新しいユーザエントリの解析を開始するたびに、 'map'の新しいインスタンスを作成しているわけではありません。古いものの値はそのまま上書きされ続けます。 ( 'hmap'はおそらく' map'でしょうか?)。 – Tibrogargan

+0

入力エラー。修正されました。 – Kaninchen

+0

@Tibrogarganは、whileループ内のすべての反復で新しいHashMapを動的に定義する必要があることを意味しますか? – Kaninchen

答えて

0

hmapがコード内で再利用されているため、値が上書きされているので、リストに追加するときには同じものに新しい参照を追加するだけです。

List<HashMap> list = new ArrayList<>(); 
HashMap<String, String> hmap; 
String raw = "<CONTENT><DETAIL><USER>user1</USER><MAIL>[email protected]</MAIL></DETAIL><DETAIL><USER>user2</USER><MAIL>[email protected]</MAIL></DETAIL></CONTENT>"; 
String partRas = ""; 
int index = raw.indexof("<USER>"); 

while(index >= 0) { 
    if(index + 50 < raw.length()) 
     partRaw = raw.subString(index, index + 50); 

    /* 
    * Create a new, empty HashMap 
    */ 
    hmap = new HashMap<>(); 
    hmap("user", getTagValue(partRaw, "USER")); 
    hmap("email", getTagValue(partRaw, "MAIL")); 
    list.add(hmap); 

    raw = raw.subString(index + 50, raw.length()); 
    index = raw.indexof("<USER>"); 
} 

System.out.println(new Gson().toJson(list)); 

public static String getTagValue(String xml, String tagName){ 
    return xml.split("<"+tagName+">")[1].split("</"+tagName+">")[0]; 
} 

あなたが実際に(エラーチェックが悲惨であっても)これをチェックすることもできます。

String raw = "<CONTENT><DETAIL><USER>user1</USER><MAIL>[email protected]</MAIL></DETAIL><DETAIL><USER>user2</USER><MAIL>[email protected]</MAIL></DETAIL></CONTENT>"; 
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder dBuilder; 

try { 
    dBuilder = dbFactory.newDocumentBuilder(); 
    Document doc = dBuilder.parse(new ByteArrayInputStream(raw.getBytes())); 
    NodeList nodes = doc.getElementsByTagName("DETAIL"); 
    for (int idx = 0; idx < nodes.getLength(); idx++) { 
     Node node = nodes.item(idx); 
     System.out.println("User: "+((Element)node).getElementsByTagName("USER").item(0).getTextContent()); 
     System.out.println("Mail: "+((Element)node).getElementsByTagName("MAIL").item(0).getTextContent()); 
    } 
} catch (Exception ex) { 
    // do stuff 
} 
+0

まあ、私は他の選択肢がないように見えるが、動的定義を使う。私はListの 'add()'関数が値渡しであると思ったが、このバグの後に私は間違っていたと思う。 – Kaninchen

+0

@Kaninchen javaはプリミティブ型を除いて値渡しを行いません。 – Tibrogargan

+0

はあまりにも多くのポインタを学習していたので、このバグは私を混乱させました。なぜなら、oracleのdocの関数のパラメータフィールドに '*'や '&'がないからです。だから私はそれが前に値渡しだと思うのです。 – Kaninchen

関連する問題