用于将数据保存到ArrayList的高效代码



我的控制台从类似的XML文件中输出年份标记

2020
2019
1997
2017
2019
2017 (...)

根据这些数据,我想每隔一年将其保存在ArrayList中,例如:

Years found on file: 2020 , 2019 , 1997 , 2017

我尝试了很多方法,但似乎都不起作用。我正试图用下面的代码找到一个解决方案:

public class Publications {
public static void main(String[] args) throws IOException {
File file = new File("dblp-2020-04-01.xml");
FileInputStream fileStream = new FileInputStream(file);
InputStreamReader input = new InputStreamReader(fileStream);
BufferedReader reader = new BufferedReader(input);
String line;
ArrayList<String> publicationsList = new ArrayList<String>();
int i = 0;
while ((line = reader.readLine()) != null) {
Publications publ = new Publications();
Pattern pattern = Pattern.compile("<year>(.+?)</year>", Pattern.DOTALL);
Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
String year = matcher.group(1);
if (publicationsList.size() == 0) {
publicationsList.add(year);
}else{
for(String publications1 : publicationsList){
if(!(publications1.contains(year))){
publicationsList.add(year);
}
}
}
}
}
//READING TEST
for (String publications1 : publicationsList){
System.out.println(publications1);
}
}
}

错误:

Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:996)
at Publications.main(Publications.java:26)

ArrayList替换为LinkedHashSet,重复项将自动被忽略,而插入值的顺序仍然保留。

此外,这是2020年,所以您应该使用NIO.2 API和try-with-resources语句,这两个语句都是2011年在Java7中添加的。这将有助于解决您不关闭文件流的问题。

这就是你的代码应该是什么样子:

Set<String> publicationYears = new LinkedHashSet<>();
try (BufferedReader reader = Files.newBufferedReader(Paths.get("dblp-2020-04-01.xml"))) {
Pattern pattern = Pattern.compile("<year>(.+?)</year>", Pattern.DOTALL);
for (String line; (line = reader.readLine()) != null; ) {
Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
String year = matcher.group(1);
publicationYears.add(year);
}
}
}
//READING TEST
for (String year : publicationYears){
System.out.println(year);
}

当然,由于您正在读取XML文件,因此最好使用XML解析器,例如StAX:

Set<String> publicationYears = new LinkedHashSet<>();
try (InputStream in = Files.newInputStream(Paths.get("dblp-2020-04-01.xml"))) {
XMLStreamReader xml = XMLInputFactory.newFactory().createXMLStreamReader(in);
while (xml.hasNext()) {
xml.next();
if (xml.getEventType() == XMLStreamConstants.START_ELEMENT) {
if (xml.getLocalName().equals("year")) {
String year = xml.getElementText();
publicationYears.add(year);
}
}
}
}

最新更新