1

HashMap を別のハッシュマップに保存しようとしています。

問題は、内側のハッシュマップに 1 つのキーと値を保存するときに発生します。

値を回復しようとすると、常に null が返されます。

HashMapが機能しないようです...なぜですか??

私は保護された最終的なグローバル変数を作成しようとしました..そして何も:(

protected final Map<Integer,Map> HMG =  new HashMap<Integer,Map>(); //GLOBAL VARAIBLE

    List<org.jdom2.Element> hijos = root.getChildren();
    for(int i=0 ; i < hijos.size(); i++) {
        org.jdom2.Element elem = hijos.get(i);
        String file = elem.getName();
        HMG.put(i, new HashMap<String, String>());
        System.out.println("Hashmap saved to "+ i+" "+file );
        System.out.println(file + i);
        List<org.jdom2.Element> hijos2 =elem.getChildren();
        for (org.jdom2.Element e : hijos2){
            guardarAtributos(e,i);
        }
    }

public void guardarAtributos(org.jdom2.Element elemento,Integer orden) {
    List<org.jdom2.Attribute> atributos=elemento.getAttributes();
     Map<String,String> a =HMG.get(orden);
     for (org.jdom2.Attribute atrib : atributos) {
         a.put(atrib.getName(), atrib.getValue());
         System.out.println("Writting into miniHashMap ===> "+atrib.getName()+" "+" "+atrib.getValue());
         System.out.println("Testing:::::"+ a.get(0));
    }
}

出力は次のとおりです。

Hashmap saved to 0 Number
Number0
Writting into miniHashMap ===> value  3
Testing:::::null
Writting into miniHashMap ===> value  1
Testing:::::null
Writting into miniHashMap ===> value  4
Testing:::::null
Hashmap saved to 1 Number
Number1
Writting into miniHashMap ===> value  88
Testing:::::null

編集!: ありがとうございます。

public void recuperarHashMap(Integer orden){
 Map<String,String> hash= HMG.get(orden);
 for(Entry<String, String> entry: hash.entrySet()) {
     System.out.println(entry.getKey());
     System.out.println(entry.getValue());
 }
}

テスト クラス:

a.recuperarHashMap(0);
a.recuperarHashMap(1);

出力:

value
4
value
88

最後の値のみを取得します!! どうして?!!!どうもありがとう:) 私は初心者です!:(

編集2!!

XMLはそのようなものです(emfツールエディタで作成)

<?xml version="1.0" encoding="UTF-8"?>
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:language1="language1">
  <language1:Number id="PI">
    <has value="3"/>
    <has value="1"/>
    <has value="4"/>
  </language1:Number>
  <language1:Number id="888">
    <has value="88"/>
  </language1:Number>
</xmi:XMI>
4

2 に答える 2

7

あなたが入れているのと同じものをテストしていません:

a.put(atrib.getName(), atrib.getValue());
...
System.out.println("Testing:::::"+ a.get(0));

atrib.getName()数字は0じゃないですか。コードを次のように変更した場合:

System.out.println("Testing:::::"+ a.get(atrib.getName()));

問題なく値を回復できることがわかります。あなたは何をすると思っa.get(0)ていましたか?おそらく、マップ内の最初の要素を返すことを期待していましたか? マップはそのようには機能しません。メソッドはkeyget()でフェッチします。

編集: のキーで複数のエントリを設定しvalueている場合、名前が の複数の属性があることを示唆していますvalue。2 つのループがあることに注意してください。

for (org.jdom2.Element e : hijos2){
    guardarAtributos(e,i);
}

と:

for (org.jdom2.Attribute atrib : atributos) {
    a.put(atrib.getName(), atrib.getValue());
    ...
}

したがって、すべてにvalue属性を持つ複数の要素がある場合は、 yesを使用すると、以前の値が後の値で上書きされます。

次のような XML があると思われます。

<root>
  <child>
    <x value="3" />
    <y value="1" />
    <z value="4" />
  </child>
  <child>
    <x value="88" />
  </child>
</root>  

...しかし、あなたはあなたの XML を私たちに見せていないので、はっきりとは言えません。

編集: XML を見たので、属性名を使用している理由、またはマップが必要な理由がまったく明確ではありません。あなたが本当に欲しいのは私には見えますList<List<String>>

List<List<String> elementValues = new ArrayList<List<String>>();

List<Element> elements = root.getChildren();
for (Element element : elements) {
    List<String> values = new ArrayList<String>();
    for (Element child : element.getChildren()) {
        values.add(child.getAttributeValue("value"));
    }
}

これは、マップなどを使用するよりもはるかに簡単です。

于 2013-03-25T19:19:11.150 に答える
-1

最後の変数は上書きできません

于 2013-03-25T19:25:41.423 に答える