0

以下のコードは、ReadXMLFile コンストラクターを呼び出します。

ReadXMLFile r=new ReadXMLFile("small.xml");
HashMap r=r.getrcset();

ReadXMLFile コンストラクターによって呼び出される update fn を使用して、sathiya ハッシュマップを更新しています。正常に機能しています。つまり、印刷できるため、更新内で(要素がsathiyaハッシュマップに追加されています)。しかし、getrcset ファイルでは、sathiya ハッシュマップが空です。印刷しようとすると、 0: {} 1:{} が表示されます。yが空だとわかりません

package iws.falcon.matcher.pbm;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.util.HashMap;
import java.util.Iterator;
import java.util.*; 

public class ReadXMLFile {

public HashMap sathiya = new HashMap();
String filepath=null;
int cid=0;
int f=0;
HashMap rc=null;

public HashMap getrcset()
{
System.out.println("inside getsathiya"+sathiya.size());
Set set = sathiya.entrySet();
// Get an iterator
Iterator i = set.iterator();
// Display elements
while(i.hasNext()) {
Map.Entry me = (Map.Entry)i.next();
System.out.print(me.getKey() + ": ");
System.out.println(me.getValue());
}
System.out.println("god"+sathiya);
return sathiya;
}

public void update(HashMap god)
{
sathiya.put(cid,god);
for (int i=0,n=sathiya.size();i<n;i++)
System.out.println("inside update fn"+sathiya.get(i));
cid++;
}

   public ReadXMLFile (String fp) 
    {
    filepath=fp;
     try {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser saxParser = factory.newSAXParser();
    DefaultHandler handler = new DefaultHandler() {
    boolean name = false;
    boolean cluster=false;

    public void startElement(String uri, String localName,String qName, 
                Attributes attributes) throws SAXException {

        if (qName.equalsIgnoreCase("CLUSTER")) 
        {rc=new HashMap();

        }`enter code here`

        if (qName.equalsIgnoreCase("URI")) {
            name = true;
        }

    }

    public void endElement(String uri, String localName,
        String qName) throws SAXException {


        if (qName.equalsIgnoreCase("CLUSTER")) 
            {
            update(rc);
            rc.clear();
            }

}

    public void characters(char ch[], int start, int length) throws SAXException {
        if (name) 
        {
            String e= new String(ch, start, length);
            rc.put(e,e);
            name = false;
        }

    }

     };

       saxParser.parse("small.xml", handler);

     } catch (Exception e) {
       e.printStackTrace();
     }

   }

}
4

1 に答える 1

1

私は質問のタイトルとあなたのこの行に完全に混乱していますが:

しかし、getrcset ファイルの rcset は空ではありません ??

あなたの質問がなぜsathiya空なのですか?その理由は、更新後に rc で clear を呼び出しているためですsathiya

if (qName.equalsIgnoreCase("CLUSTER")) {
    update(rc);
    rc.clear();// This line is clearing the content of rc
}

プログラムの動作は、次のコードのようになります。

Map<Integer, Map<String, String>> mainCont = new HashMap<Integer, Map<String,String>>();

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

content.put("1", "1");

mainCont.put(1, content);

System.out.println(mainCont);

content.clear();

System.out.println(mainCont);

上記のコードでは、mainCont はコンテンツへの参照を保持しています。コンテンツがクリアされると、そのオブジェクトを参照しているため、コンテンツの更新された値が mainCont に表示されます。

content.clear();しかし、あなたがそれを作る場合の代わりにcontent = new HashMap<String, String>();

コンテンツが別のオブジェクトを指しているため、mainCont にすべての値があることがわかります。

コードに戻ります。

それ以外の :

if (qName.equalsIgnoreCase("CLUSTER")) {
    update(rc);
    rc.clear();
}

これを行う:

if (qName.equalsIgnoreCase("CLUSTER")) {
    update(rc);
    rc = new HashMap();
}

オフトピック:

プレーンで安全でないコレクションを使用する代わりに、ジェネリックを使用することを検討してください。

于 2012-05-01T16:45:33.927 に答える