java - 文件输入到 arrayList 中。用于创建新对象的相同 arrayList

标签 java arrays regex arraylist

我正在开发一个程序,我从文件中获取输入并使用正则表达式删除我需要的内容。我剔除了整数和字符串。每行一个。每一行都有一个对象的信息。

    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=Wat​​erOff,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的范围。 您需要重新设计逻辑以避免这种情况。

您尚未共享 typeOfTimetypeOfEvents 的声明。 尝试这样的事情:

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/

相关文章:

java - 使用 CountDownLatch 测试强制竞争条件导致 java.lang.IllegalMonitorStateException

java - 使用 BFS 构建迷宫?

java - 如何从任何 java gui 中删除窗口框

javaxt图像抛出异常

c - float 组的总和返回不同的结果

java - 将 .wav 转换为数组

Javascript:了解应用于小费计算器的 map 和 reduce

android - 生日格式

regex - Xcode 6 不再识别\1,\2,\# 模式?

regex - 使用前瞻在正则表达式上拆分