2011-12-28 4 views
1

Im разбор XML-файла. Мой обработчик XML, мой объект, который содержит Arraylist массивов, и основной класс, который запускает все и печатает его. Проблема в том, что каждый раз, когда я добавляю массив к моему 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

Извините, в первый раз LOL просто убедитесь, что было достаточно информации, чтобы решить. – chartle7

+0

Эквивалентный вопрос задавался много раз. –

ответ

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

2

В действительности, значение в Листе не меняется при добавлении следующего значения, но массив part изменяется , Я имею в виду, что в списке есть ссылка на номер такой же массив, который вы называете частью. Другими словами, Список фактически не копирует объект, а сохраняет что-то (думая об этом как «переменную»), которая ссылается на объект.

Таким образом, если вы измените объект, на который ссылается любой индекс, вы увидите эти изменения, когда вы выйдете из списка. Чтобы решить эту проблему, создайте новый массив каждый раз, когда вы добавляете в список явным образом, используя ключевое слово new (или вы можете clone массив каждый раз, когда вы добавляете).

+0

Я бы проголосовал за тебя, но у меня нет достаточного количества очков. извините:/ – chartle7

Смежные вопросы