2010-08-05 6 views
1

Я хочу, чтобы заполнить ArrayList (Appointment_List) с HashMap «с (Ежедневниками), но каждый раз, когда мне нужно, чтобы изменить значение указанных элементов (Appt_Start_Time и конец времени).Заливка ArrayList с HashMaps

Вот код:

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 каждый раз, когда я добавить новый элемент?

+3

Ваш PHP/C конвенции стиль именования не очень помогает интерпретировать фрагмент кода легко. При написании Java попробуйте придерживаться [Соглашения об именах Java] (http://www.oracle.com/technetwork/java/codeconventions-135099.html#367). – BalusC

+0

Это не отвечает на ваш вопрос, но я думаю, что у вас может быть ошибка «один за другим» в вашем цикле. Вы уверены, что не хотите начинать с i = 0? –

ответ

0

Ваши объекты содержат ссылку на Start_Time. Так как вы продолжаете использовать одну и ту же переменную, только переменная меняется на указатель на объект. Таким образом, все ваши объекты имеют поле, указывающее на один и тот же объект.

Попробуйте использовать новую реализацию Даты для каждой итерации цикла.

+0

Что вы подразумеваете под «новой реализацией даты»? – ama

+0

Я имею в виду, что вы создаете новый экземпляр переменной. –

+0

Извините, можете ли вы помочь мне, написав, что вы говорите? – ama

0

Используйте clone() при добавлении нового объекта на карту.

При добавлении объекта в карту добавленный объект ссылается только на карту.

0

Вам необходимо создать новый экземпляр Start_Time и End_Time в цикле for. Если вы этого не сделаете, один и тот же объект добавляется каждый раз, указывая тем же самым данным в вашей памяти.

1

Назначение - это один и тот же экземпляр HashMap на каждой итерации. Вы должны сделать что-то вроде этого:

Appointment = new HashMap();

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

Appointment_List.add(Appointment)

Таким образом, вы будете положить свежую новую карту в список каждой итерации.

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)); 
    } 
} 
Смежные вопросы