Java ArrayList of arrays不断用添加的最新数组覆盖我以前的数组
我正在解析一个xml文件。我的XML处理程序、保存数组数组列表的对象,以及运行并打印所有内容的主类。问题是,每次我向arraylist添加一个数组时,它都会将以前添加的所有数组更改为与当前相同的数组。我以为这只是一个静电问题,但一旦我把静电从所有东西中去掉,它仍然在做同样的事情。请帮忙,我需要尽快把这件事做完 这是我的处理程序: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
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只是确保有足够的信息来解决。一个同等的问题已经被问了很多很多次。非常感谢。我开始思考这个问题,但我找不到问题所在。我以为这是个静态问题。非常感谢。我开始思考这个问题,但我找不到问题所在。我认为这是一个静态问题。