2011-12-28 9 views
1

xmlファイルを解析しています。私のXMLハンドラ、配列のArraylistを保持するオブジェクト、およびすべてを実行し、それを印刷するメインクラス。問題は、私がarraylistに配列を追加するたびに、以前に追加された配列のすべてを現在のものと同じに変更することです。私は静的な問題だと思っていましたが、いったん静的なものを取り除くと、同じことをやっています。助けてくださいこれはできるだけ早く行う必要があります。ここで配列の配列リストは、私の前の配列を最新の配列で上書きし続けます。

は私のハンドラである:ここでは

import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

public class MyXMLHandler extends DefaultHandler { 

public int counter = 0; 
public String[] part = new String[4]; 
Boolean currentElement = false; 
String currentValue = null; 
public SitesList sitesList = null; /this used to be static 

public SitesList getSitesList() { //this used to be static 
    return sitesList; 
} 

public void setSitesList(SitesList sitesList) { //this used to be static 
    MyXMLHandler handle = new MyXMLHandler(); //thats why the object 
    handle.sitesList = sitesList; 
} 

/** 
* Called when tag starts (ex:- <name>text</name> -- <name>) 
*/ 
@Override 
public void startElement(String uri, String localName, String qName, 
     Attributes attributes) throws SAXException { 

    currentElement = true; 

    if (localName.equals("string-array")) { 
     /** Start */ 

     String attr = attributes.getValue("name"); 
     sitesList = new SitesList(attr); 
    } 

} 

/** 
* Called when tag closing (ex:- <name>text</name> -- </name>) 
*/ 
@Override 
public void endElement(String uri, String localName, String qName) 
     throws SAXException { 
    currentElement = false; 

    /** set value */ 
    if (counter == 4) { 
     sitesList.addPart(part); 
     counter = 0; 
    } 
    if (localName.equalsIgnoreCase("item")) { 
     part[counter] = currentValue; 
     counter++; 
    } 
    currentValue = ""; 

} 

/** 
* Called to get tag characters (ex:- <name>text</name> -- to get 
* text Character) 
*/ 
@Override 
public void characters(char[] ch, int start, int length) 
     throws SAXException { 

    if (currentElement) { 
     currentValue = new String(ch, start, length); 
     currentElement = false; 
    } 

} 

} 

は私SitesListオブジェクトが実際に

import java.util.ArrayList; 

/** Contains getter and setter method for varialbles */ 
public class SitesList { 

/** Variables */ 
private ArrayList<String[]> part = new ArrayList<String[]>(); 

/** 
* In Setter method default it will return arraylist change that to add 
*/ 
public SitesList(String c) { 
    String[] comp = new String[1]; 
    comp[0] = c; 
    part.add(comp); 
    // company name is part(0)[0] 
} 

public String getCompany() { 
    return this.part.get(0)[0]; 
} 

public ArrayList<String[]> getPart() { 
    return part; 
} 

public void addPart(String[] name) { 
    part.add(name); 
} 

public String getName(int i) { 
    return this.part.get(i)[0]; 
} 

public String getComp1(int i) { 
    return this.part.get(i)[1]; 
} 

public String getComp2(int i) { 
    return this.part.get(i)[2]; 
} 

public String getComp3(int i) { 
    return this.part.get(i)[3]; 
} 

public int getSize() { 
    return this.part.size(); 
} 

} 
+1

これはSOの質問のためにあまりにも多くのコードです。これを最小限に抑えてください(http://sscce.orgを参照してください)。 –

+0

申し訳ありませんが、最初に、解決するのに十分な情報があることを確認するだけです。 – chartle7

+0

同等の質問が何度も何度も尋ねられています。 –

答えて

2

partを再利用しています。つまり、複数回追加しますが、その内容は上書きされます。 ArrayListはここに無実です:)

変更これにパーツを追加します。Java 6のよう

if (counter == 4) { 
    sitesList.addPart(part); 
    //create a new array 
    part = new String[4]; 
    counter = 0; 
} 

または、:

if (counter == 4) { 
    //add a copy to the list 
    sitesList.addPart(Arrays.copyof(part, part.length));  
    counter = 0; 
} 
+0

ありがとうございます。私はその地域の周りに何かを考えるようになっていたが、どこに問題があるのか​​見つからなかった。静的な問題だと思った。 – chartle7

2

で、リストの値が次の値が追加されたときに変更されていないが、配列partが変更されました。つまり、リストには、各場所での参照からの同じの配列があり、これはパートと呼ばれます。言い換えれば、Listは実際にオブジェクトをコピーするのではなく、オブジェクトを参照する何かを(変数と考える)格納します。

リストを参照しているオブジェクトを変更すると、任意のインデックスが参照されますので、リストから抜け出すとその変更が表示されます。この問題を解決するには、newキーワードを使用して明示的にリストに追加するたびに新しい配列を作成します(または、追加するたびに配列clone)。

+0

私はあなたに投票するだろうが、私は十分なポイントを持っていない。申し訳ありません:/ – chartle7

関連する問題