Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList of arrays不断用添加的最新数组覆盖我以前的数组_Java_Xml_Static_Replace_Arraylist - Fatal编程技术网

Java ArrayList of arrays不断用添加的最新数组覆盖我以前的数组

Java ArrayList of arrays不断用添加的最新数组覆盖我以前的数组,java,xml,static,replace,arraylist,Java,Xml,Static,Replace,Arraylist,我正在解析一个xml文件。我的XML处理程序、保存数组数组列表的对象,以及运行并打印所有内容的主类。问题是,每次我向arraylist添加一个数组时,它都会将以前添加的所有数组更改为与当前相同的数组。我以为这只是一个静电问题,但一旦我把静电从所有东西中去掉,它仍然在做同样的事情。请帮忙,我需要尽快把这件事做完 这是我的处理程序: import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.h

我正在解析一个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;
    }

}

}
import org.xml.sax.Attributes;
导入org.xml.sax.SAXException;
导入org.xml.sax.helpers.DefaultHandler;
公共类MyXMLHandler扩展了DefaultHandler{
公共整数计数器=0;
公共字符串[]部分=新字符串[4];
布尔currentElement=false;
字符串currentValue=null;
public SitesList SitesList=null;/n过去是静态的
public SitesList getSitesList(){//这以前是静态的
返回站点列表;
}
public void setSitesList(SitesList SitesList){//这以前是静态的
MyXMLHandler handle=new MyXMLHandler();//这就是对象
handle.sitesList=sitesList;
}
/**
*标记启动时调用(例如:-文本--)
*/
@凌驾
public void startElement(字符串uri、字符串localName、字符串qName、,
属性)引发SAX异常{
currentElement=true;
if(localName.equals(“字符串数组”)){
/**开始*/
字符串attr=attributes.getValue(“名称”);
站点列表=新站点列表(属性);
}
}
/**
*标记关闭时调用(例如:-文本--)
*/
@凌驾
公共void endElement(字符串uri、字符串localName、字符串qName)
抛出SAX异常{
currentElement=false;
/**设定值*/
如果(计数器==4){
站点列表。添加部分(部分);
计数器=0;
}
if(localName.equalsIgnoreCase(“项”)){
部分[计数器]=当前值;
计数器++;
}
currentValue=“”;
}
/**
*调用以获取标记字符(例如:-文本--获取
*文本字符)
*/
@凌驾
公共无效字符(字符[]ch,整数开始,整数长度)
抛出SAX异常{
if(当前元素){
currentValue=新字符串(ch、开始、长度);
currentElement=false;
}
}
}
这是我的站点列表对象

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();
}

}
import java.util.ArrayList;
/**包含变量的getter和setter方法*/
公共类站点列表{
/**变数*/
private ArrayList part=new ArrayList();
/**
*在Setter方法默认值中,它将返回要添加的arraylist更改
*/
公共站点列表(字符串c){
字符串[]comp=新字符串[1];
comp[0]=c;
第2部分增加(公司);
//公司名称为第(0)部分[0]
}
公共字符串getCompany(){
返回此.part.get(0)[0];
}
公共阵列列表getPart(){
返回部分;
}
public void addPart(字符串[]名称){
第.部分添加(名称);
}
公共字符串getName(int i){
返回此.part.get(i)[0];
}
公共字符串getComp1(int i){
返回此.part.get(i)[1];
}
公共字符串getComp2(int i){
返回此.part.get(i)[2];
}
公共字符串getComp3(int i){
返回此.part.get(i)[3];
}
公共int getSize(){
返回此.part.size();
}
}

实际上,当添加下一个值时,列表的值不会改变,但是数组的
部分会改变。我的意思是,列表在每个位置都有对同一数组的引用,您称之为part。换句话说,列表实际上并不复制对象,而是存储引用该对象的某些内容(将其视为“变量”)


因此,很自然,如果您更改列表在任何索引处引用的对象,那么当您从列表中拉出时,您将看到这些更改。要解决此问题,请在每次使用
new
关键字显式添加到列表时创建一个新数组(或者每次添加时可以
clone
该数组)。

实际上,添加下一个值时列表的值不会更改,但数组
部分会更改。我的意思是,列表在每个位置都有对同一数组的引用,您称之为part。换句话说,列表实际上并不复制对象,而是存储引用该对象的某些内容(将其视为“变量”)


因此,很自然,如果您更改列表在任何索引处引用的对象,那么当您从列表中拉出时,您将看到这些更改。要解决此问题,请在每次使用
new
关键字显式添加到列表时创建一个新数组(或者每次添加时都可以
克隆该数组)。

您正在重用
部分,即多次添加该部分,但覆盖其内容
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;
}

您正在重复使用
零件
,即多次添加该零件,但覆盖其内容
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;
}

对于这样一个问题来说,代码太多了。请将这个问题减少到显示问题所需的绝对最小值(请阅读)。对不起,第一次lol只是确保有足够的信息来解决。一个同等的问题已经被问了很多很多次。对于一个如此多的问题来说,这是太多的代码了。请把这个问题减少到显示问题所需的绝对最小值(请阅读)。对不起,第一次lol只是确保有足够的信息来解决。一个同等的问题已经被问了很多很多次。非常感谢。我开始思考这个问题,但我找不到问题所在。我以为这是个静态问题。非常感谢。我开始思考这个问题,但我找不到问题所在。我认为这是一个静态问题。