2011-12-28 38 views
1

Im解析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)。 – 2011-12-28 16:27:24

+0

对不起,第一次大声笑,只是确保有足够的信息来解决。 – chartle7 2011-12-28 16:37:46

+0

一个等价的问题已被问及很多次。 – 2011-12-28 16:49:35

回答

2

您正在重复使用part,即您多次添加它,但会覆盖其内容。 ArrayList是无辜的在这里:)

更改添加部分这样的:

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

或者,如Java 6:

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

非常感谢。我开始考虑围绕该区域的事情,但我无法找到问题所在。我认为这是一个静态问题。 – chartle7 2011-12-28 16:41:00

2

在现实中,在添加下一个值列表的价值观并没有改变,但数组part改变。我的意思是,列表中的每个位置都有一个参考相同的阵列,您称之为部分。换句话说,List实际上并不是对象的副本,而是存储引用该对象的某些东西(将其视为“变量”)。所以很自然地,如果你改变列表在任何索引处引用的对象,当你退出列表时你会看到这些改变。要解决此问题,请每次使用关键字new明确添加到列表时创建一个新阵列(或者每次添加时您可以在阵列中添加clone)。

+0

我会投你一票,但我没有足够的分数。对不起:/ – chartle7 2011-12-28 16:41:20