我想用 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 ?
答案 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));
}
}