使用散列图填充ArrayList

时间:2010-08-05 09:53:06

标签: java

我想用 HashMap 约会)填充 ArrayList Appointment_List ),但每个时间我需要更改指定元素的值( Appt_Start_Time endtime )。

以下是代码:

for (int i = 1; i < Appt_Length; i++) {
    Start_Time = End_Time;
    Start_Minute = Curr_Start_Minute;
    Start_Minute += My_Calendar.Get_Time_Interval();
    if (Start_Minute >= 60) {
        Tmp_Start_Hour += 1;
        Curr_Start_Minute = 0;
    } else {
        Curr_Start_Minute = Start_Minute;
    }
    End_Time = Time.Get_Index_Time(Tmp_Start_Hour, Curr_Start_Minute);
    Appointment.remove("Appt_Start_Time");
    Appointment.put("Appt_Start_Time", Start_Time);
    Appointment.remove("endtime");
    Appointment.put("endtime", End_Time);
    Appointment_List.add(Appointment);
}

但在执行此代码后,我在 Appointment_List 中获得了约会,但所有约会都有Appointment.get("Appt_Start_Time")Appointment.get("endtime")等于循环附带的最后值。

为什么每次添加新元素时都会重置 Appt_Start_Time endtime

5 个答案:

答案 0 :(得分:1)

约会是每次迭代的同一个HashMap实例。你应该这样做:

Appointment = new HashMap();

// ... do something with appointment ...

Appointment_List.add(Appointment)

这样,您每次迭代都会在列表中添加一个全新的地图。

答案 1 :(得分:0)

您的对象包含对Start_Time的引用。由于您不断重用相同的变量,因此只有更改的是指向对象的指针。这样,所有对象都有一个指向同一对象的字段。

尝试在循环的每次迭代中使用Date的新实现。

答案 2 :(得分:0)

向地图添加新对象时使用clone()

将对象添加到地图时,添加的对象仅由地图引用。

答案 3 :(得分:0)

您需要在for循环中创建Start_Time和End_Time的新实例。 如果不这样做,则每次都会添加相同的对象,因此也会指向内存中的相同数据。

答案 4 :(得分:0)

我认为代码应该更像这样:

public class Appointment {
    public Appointment(Date startTime, Date endTime) {
    }
}

public void fillAppointments() {
    int totalAppointments = 10;
    List<Appointment> appointments = new ArrayList<Appointment>();
    Date startTime = new Date();
    Date endTime = new Date();
    for (int i = 1; i < totalAppointments; i++) {
        startTime = new Date(endTime.getTime());
        // ... other magic code ...
        endTime = new Date();
        appointments.add(new Appointment(startTime, endTime));
    }
}