在这里可能缺少一些非常简单的东西,但基本上我有一些对象希望存储在全局arrayList中。但是,当我离开该函数并尝试访问同一arrayList中的对象元素时,字段被覆盖,我不确定如何。

我已将问题明确定位到特定区域,并将显示相关代码。日期(timeSlot \ Calendar)对象是此问题的指示器。

requestHandler(){
        Pattern pattern = Pattern.compile("*irrelevant regex*");
        Matcher matcher = pattern.matcher(element);

        while(matcher.find()) {

            int requestID = Integer.parseInt(matcher.group(1));

            Calendar startDate = dateHandler(matcher.group(2));
            Calendar endDate = dateHandler(matcher.group(3));

            TimeSlot timeSlot = generateTimeSlot(startDate, endDate);
            TransmissionRequest t_Request = transmissionHandler(matcher.group(4));

            BookingRequest request = new BookingRequest(requestID, timeSlot, t_Request);

            requestList.add(request);

            // debug //
            System.out.println(request);
        }
}


出于调试目的,我在最底部添加了print语句,它为我提供了正确的输出。基本上将timeSlot打印为每个BookingRequest的字符串。因此很明显,将具有正确request值的timeSlot对象添加到requestList中。

输出(我忽略了不相关的字段)

BookingRequest:1
Date= 11:00 Mar-25 to 12:00 Mar-26

BookingRequest:2
Date= 12:00 Mar-24 to 03:00 Mar-27

BookingRequest:3
Date= 01:00 Mar-26 to 09:00 Mar-26

BookingRequest:4
Date= 11:00 Mar-25 to 09:00 Mar-26

BookingRequest:5
Date= 11:00 Mar-26 to 09:00 Mar-27


但是,一旦我离开此函数并尝试通过ArrayList requestList打印此完全相同的输出,就会得到以下结果。

输出值

BookingRequest:1
Date= 11:00 Mar-26 to 09:00 Mar-27

BookingRequest:2
Date= 11:00 Mar-26 to 09:00 Mar-27

BookingRequest:3
Date= 11:00 Mar-26 to 09:00 Mar-27

BookingRequest:4
Date= 11:00 Mar-26 to 09:00 Mar-27

BookingRequest:5
Date= 11:00 Mar-26 to 09:00 Mar-27


似乎每个timeSlot对象都被处理的最后一个timeSlot对象覆盖。我尚未对数组进行任何修改,并确保在调用requestHandler()之后立即获得此输出。下面的代码。

for(String element : input){

    // Extract requests
    if(element.matches("^Request.*")){
        requestHandler(element);
    }

}
for(BookingRequest request : requestList){
    System.out.println(request);
}


如果您认为问题出在这里,这些也是相关的handlergenerate函数。两者都创建TimeSlotCalendar的新实例,因此我认为重新分配同一实例不存在问题。

public static Calendar dateHandler(String stringExtract){
    Calendar date = new GregorianCalendar();
    SimpleDateFormat format = new SimpleDateFormat("HH MMM dd", Locale.ENGLISH);
    try {
        date.setTime(format.parse(stringExtract));
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return date;
}


public static TimeSlot generateTimeSlot(Calendar start, Calendar end){
    TimeSlot newTimeSlot = new TimeSlot(start, end);
    return newTimeSlot;
}


我花了太长时间试图弄清楚确切的问题是什么。我感觉到它也可能与matcher.find()的行为有关,但是我确实尽力尝试所有事情以仅找出确切的问题,更不用说解决它了。

任何帮助将不胜感激!

最佳答案

也许您应该检查静态字段:即BookingRequest.timeSlotTimeSlot本身。

09-11 20:29