ArrayList массивов продолжает переписывать мои предыдущие массивы с добавлением новейшего массива - PullRequest
1 голос
/ 28 декабря 2011

Я анализирую XML-файл.Мой обработчик XML, мой объект, который содержит 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();
}

}

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Вы повторно используете 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;
}
2 голосов
/ 28 декабря 2011

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

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

...