我正在开发一个程序,我从文件中获取输入并使用正则表达式删除我需要的内容。我剔除了整数和字符串。每行一个。每一行都有一个对象的信息。
try{
Scanner getAll = new Scanner(new FileReader(eventsFile));
while(getAll.hasNextLine()){
fileToArray.add(getAll.nextLine());
}
}
catch(FileNotFoundException e){
System.out.println("the file name you entered is not present in the directory");
}
catch(IOException e){
System.out.println("An I/O error present");
}
System.out.println(fileToArray.size());
// we put our regular expression here which kicks out the event
//eventPat gets everything after Event= and before ,time
Pattern eventPat = Pattern.compile("(?<=Event=)(.*)(?=,time)");
//timePat looks for everynumber from 0-9 whose size is 1 up to 5
Pattern timePat = Pattern.compile("[0-9]{1,5}");
然后,我继续将 int 添加到一个数组,并将字符串添加到另一个数组。
// this for loop takes the fileToArray which has all the example file contents inside and matches it for eventPat and adds its findings to an array called typeOfEvents
for(int i =0 ; i < fileToArray.size(); i++){
String friskOne = fileToArray.get(i).toString();
Matcher eventSeeker = eventPat.matcher(friskOne);
while(eventSeeker.find()){
typeOfEvents.add(eventSeeker.group());
}
}
// this for loop takes the fileToArray which has all the example file contents inside and matches it for timePat and adds its findings to an array called typeOfTime
for(int i =0 ; i < fileToArray.size(); i++){
String frisk = fileToArray.get(i).toString();
Matcher timeSeeker = timePat.matcher(frisk);
while(timeSeeker.find()){
typeOfTime.add(timeSeeker.group());
}
}
然后我使用了一个循环来制作对象。我获取每个数组的第一个索引并将它们配对在一起。某些对象可能不需要,因为最初没有在文件中创建它们的说明。
// here the loop takes the first event in the typeOfEvent array and runs it with the first
//this works since everything in , typeOfEvents and typeOfTime is added in the order that it is //present in the example file. The cast is added
//so that the data is changed from object to type long and string
public void action() {
for(int i = 0 ; i < typeOfTime.size(); i ++){
if(String.valueOf(typeOfEvents.get(i))=="WaterOff")
{Long a = (Long.valueOf((String)typeOfTime.get(i)));
addEvent(new WaterOff(a));}// Clarification needed does this convert to long from
else if ((String)typeOfEvents.get(i)=="WindowMalfunction")
addEvent(new WindowMalfunction(Long.valueOf((String)typeOfTime.get(i)))); }
错误之一是我收到索引越界错误。 其次,我认为我没有将文件输入转换为正确的类型。我需要将字符串数组中的所有字符串转换为 String,并将存储在 int 数组中的所有整数转换为 long,因为这就是我创建对象所需的。 例子 该文件有一行 - Event=WaterOff,time=10000 我将 WaterOff 存储在 eventSeeker 中,因为 WaterOff 是一个事件。我在 timeSeeker 中保留 10000 作为其时间。我必须稍后输入它们来制作对象。
谢谢
最佳答案
在此循环中:
for(int i = 0 ; i < typeOfTime.size(); i ++){ if(String.valueOf(typeOfEvents.get(i))=="WaterOff")
您正在迭代直到typeOfTime
结束,
但访问不同列表 typeOfEvents
的元素。
当typeOfTime
的大小大于typeOfEvents
的大小时,可能会发生IndexOutOfBoundsException,
因此i
的值将超出typeOfEvents
的范围。
您需要重新设计逻辑以避免这种情况。
您尚未共享 typeOfTime
和 typeOfEvents
的声明。
尝试这样的事情:
List<String> typeOfEvents = new ArrayList<String>();
List<Long> typeOfTime = new ArrayList<Long>();
要在 typeOfTime
中添加 Long
,请像这样编写:
typeOfTime.add(Long.parseLong(timeSeeker.group()));
代码质量问题
请注意,您不需要像这样的两个循环:
for(int i =0 ; i < fileToArray.size(); i++) { // logic to fill typeOfEvents } for(int i =0 ; i < fileToArray.size(); i++) { // logic to fill typeOfTime }
您可以在一个循环中执行这两项操作:
for(int i =0 ; i < fileToArray.size(); i++) {
// logic to fill typeOfEvents
// logic to fill typeOfTime
}
你的格式太糟糕了。使用 IDE 的功能可以很好地重新格式化代码,例如在 Eclipse 中,Control Shift f 键盘快捷键将为您完成此操作。 应用上述建议并修复格式后,代码将如下所示并且更具可读性:
for(int i =0 ; i < fileToArray.size(); i++){
String frisk = fileToArray.get(i).toString();
Matcher eventSeeker = eventPat.matcher(frisk);
while(eventSeeker.find()){
typeOfEvents.add(eventSeeker.group());
}
Matcher timeSeeker = timePat.matcher(frisk);
while(timeSeeker.find()){
typeOfTime.add(timeSeeker.group());
}
}
关于java - 文件输入到 arrayList 中。用于创建新对象的相同 arrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27473497/