Java 在Arraylist中添加和获取字符串数组
我有一段从XML文件读取的代码。它获取五个字符串(groupId、groupType、filePath、author和lineNo),并首先将它们保存在字符串数组中。然后,字符串数组保存在ArrayList中。最后,最后一个“for”显示ArrayList的内容 问题是,当我想显示内容时,我只得到最后添加的字符串数组。下面是代码和输出。有人能找出问题所在吗Java 在Arraylist中添加和获取字符串数组,java,arraylist,Java,Arraylist,我有一段从XML文件读取的代码。它获取五个字符串(groupId、groupType、filePath、author和lineNo),并首先将它们保存在字符串数组中。然后,字符串数组保存在ArrayList中。最后,最后一个“for”显示ArrayList的内容 问题是,当我想显示内容时,我只得到最后添加的字符串数组。下面是代码和输出。有人能找出问题所在吗 ArrayList<String[]> developerTypes = new ArrayList<String[]&g
ArrayList<String[]> developerTypes = new ArrayList<String[]>();
String[] developerInfo = {null, null, null, null, null};
String[] developerInfoR = {null, null, null, null, null};
String groupId;
String groupType;
String filePath;
String author;
String lineNo;
SAXBuilder builder = new SAXBuilder();
Document doc = (Document) builder.build("A.xml");
Element clones = doc.getRootElement();
// Loop of clones' children (clone_group)
List<Element> parentElements = clones.getChildren();
for(Element parentElement:parentElements){
// Loop of clone_group's children (clone_fragment)
List<Element> elements = parentElement.getChildren();
for(Element element:elements){
// Loop of clone_fragment's children (blameInfo)
List<Element> childelements = element.getChildren();
for(Element childElement:childelements){
groupId = parentElement.getAttributeValue("groupid");
groupType = parentElement.getAttributeValue("type");
filePath = element.getAttributeValue("file");
author = childElement.getAttributeValue("author");
lineNo = childElement.getAttributeValue("lineNo");
//System.out.print(groupId + " - ");
//System.out.print(groupType + " - ");
//System.out.print(file + " - ");
//System.out.println(author);
developerInfo[0] = groupId;
developerInfo[1] = groupType;
developerInfo[2] = filePath.substring(1, filePath.lastIndexOf("."));;
developerInfo[3] = author;
developerInfo[4] = lineNo;
developerTypes.add(developerInfo);
}// for (blameInfo)
}// for (clone_fragment)
}// for (clone_group)
// Display the content of the Arraylist
for(int i = 0; i< developerTypes.size(); ++i){
developerInfoR = developerTypes.get(i);
for(int j = 0; j< developerInfoR.length; ++j){
System.out.print(developerInfoR[j] + " ");
}
System.out.print("\n");
}
您只有一个不断在循环中添加的
developerInfo
数组实例。您需要在每个循环步骤中创建一个新数组
您似乎对正在使用的contsructs的语义有一些误解。我是从您预先初始化developerFor
的方式推断出来的,但从未使用该值。数组变量只包含对数组的引用,因此每次分配给它时,之前引用的数组都会被忘记并丢弃。因此,不要预先初始化developerInfo
。事实上,你甚至不需要在使用它的地方声明它
还有一种更简单的方法可以打印数组的内容:只需调用System.out.println(Arrays.toString(developerInfo))
。这样,您甚至不需要打印代码中的内部循环
您不需要任何变量groupId、groupType、filePath、author、lineNo。只需编写示例developerInfo[0]=parentElement.getAttributeValue(“groupid”)代码>和类似。这使得代码更加明显。但使用完整对象而不是字符串[]可能是有意义的。有许多字段,每个字段的含义都位于整数索引后面
总而言之,考虑到这些建议和其他一些建议,您的代码可以改写为:
final String path = filePath.substring(1, filePath.lastIndexOf("."));
final Document doc = (Document) new SAXBuilder().build("A.xml");
final List<DeveloperInfo> developers = new ArrayList<String[]>();
for (Element parentElement : doc.getRootElement().getChildren())
for (Element element : parentElement.getChildren())
for (Element childElement : element.getChildren())
developers.add(new DeveloperInfo(
parentElement.getAttributeValue("groupid"),
parentElement.getAttributeValue("type"),
element.getAttributeValue("file"),
path,
childElement.getAttributeValue("author"),
childElement.getAttributeValue("lineNo"),
));
for (DeveloperInfo d : developerTypes) System.out.println(d);
您只有一个不断在循环中添加的developerInfo
数组实例。您需要在每个循环步骤中创建一个新数组
您似乎对正在使用的contsructs的语义有一些误解。我是从您预先初始化developerFor
的方式推断出来的,但从未使用该值。数组变量只包含对数组的引用,因此每次分配给它时,之前引用的数组都会被忘记并丢弃。因此,不要预先初始化developerInfo
。事实上,你甚至不需要在使用它的地方声明它
还有一种更简单的方法可以打印数组的内容:只需调用System.out.println(Arrays.toString(developerInfo))
。这样,您甚至不需要打印代码中的内部循环
您不需要任何变量groupId、groupType、filePath、author、lineNo。只需编写示例developerInfo[0]=parentElement.getAttributeValue(“groupid”)代码>和类似。这使得代码更加明显。但使用完整对象而不是字符串[]可能是有意义的。有许多字段,每个字段的含义都位于整数索引后面
总而言之,考虑到这些建议和其他一些建议,您的代码可以改写为:
final String path = filePath.substring(1, filePath.lastIndexOf("."));
final Document doc = (Document) new SAXBuilder().build("A.xml");
final List<DeveloperInfo> developers = new ArrayList<String[]>();
for (Element parentElement : doc.getRootElement().getChildren())
for (Element element : parentElement.getChildren())
for (Element childElement : element.getChildren())
developers.add(new DeveloperInfo(
parentElement.getAttributeValue("groupid"),
parentElement.getAttributeValue("type"),
element.getAttributeValue("file"),
path,
childElement.getAttributeValue("author"),
childElement.getAttributeValue("lineNo"),
));
for (DeveloperInfo d : developerTypes) System.out.println(d);
问题是,当我想显示内容时,我只得到最后添加的字符串数组
不,您发现有许多对同一字符串数组的引用。。。因为那是你加的。您只有一个字符串数组对象developerInfo
只是对该数组的引用。调用developerTypes.add(developerInfo)
时,会将引用复制到ArrayList
中,因此多次使用相同的引用
您应该将developerInfo
的声明和实例化拉入循环:
String[] developerInfo = {
groupId,
groupType,
filePath.substring(1, filePath.lastIndexOf(".")),
author,
lineNo
};
developerTypes.add(developerInfo);
同样,如果您在使用之前没有声明developerInfoR
,那么您的代码会更干净:
for(int i = 0; i< developerTypes.size(); ++i){
String[] developerInfoR = developerTypes.get(i);
for(int j = 0; j< developerInfoR.length; ++j){
System.out.print(developerInfoR[j] + " ");
}
System.out.print("\n");
}
一般来说,您应该尽可能晚地以最小的范围声明局部变量,最好在声明时指定一个值。在方法顶部声明所有变量确实会损害可读性
问题是,当我想显示内容时,我只得到最后添加的字符串数组
不,您发现有许多对同一字符串数组的引用。。。因为那是你加的。您只有一个字符串数组对象developerInfo
只是对该数组的引用。调用developerTypes.add(developerInfo)
时,会将引用复制到ArrayList
中,因此多次使用相同的引用
您应该将developerInfo
的声明和实例化拉入循环:
String[] developerInfo = {
groupId,
groupType,
filePath.substring(1, filePath.lastIndexOf(".")),
author,
lineNo
};
developerTypes.add(developerInfo);
同样,如果您在使用之前没有声明developerInfoR
,那么您的代码会更干净:
for(int i = 0; i< developerTypes.size(); ++i){
String[] developerInfoR = developerTypes.get(i);
for(int j = 0; j< developerInfoR.length; ++j){
System.out.print(developerInfoR[j] + " ");
}
System.out.print("\n");
}
一般来说,您应该尽可能晚地以最小的范围声明局部变量,最好在声明时指定一个值。在方法顶部声明所有变量确实会影响可读性。每次将同一数组添加到ArrayList
时,都引用了该数组
而不是声明这个字符串[]developerInfo={null,null,null,null}代码>
一开始。每次循环时创建一个新数组
String[]developerInfo=新字符串[5]
每次将同一数组添加到数组列表时,您都在引用该数组
而不是声明这个字符串[]developerInfo={null,null,null,null}代码>
一开始。每次循环时创建一个新数组
String[]developerInfo=新字符串[5]代码>在我看来,您需要知道如何使用调试器处理一个好的IDE,当您“单步执行”这样的代码时,错误会很快显现出来