Передача ArrayList по ссылке с датой объекта? - PullRequest
0 голосов
/ 28 сентября 2011

Я передаю даты ArrayList, но когда я изменяю объект Date, все Date внутри ArrayList изменятся.Это пример:

Date currentDate = new Date("6/10/2011");
ArrayList<Date> datesList = new ArrayList();

currentDate.setDate(currentDate.getDate() + 1);
datesList.add(currentDate);

currentDate.setDate(currentDate.getDate() + 1);
datesList.add(currentDate);

currentDate.setDate(currentDate.getDate() + 1);
datesList.add(currentDate);

System.out.println(datesList.toString());

Это напечатает:

[Mon Jun 13 00:00:00 EDT 2011, Mon Jun 13 00:00:00 EDT 2011, Mon Jun 13 00:00:00 EDT 2011]

Есть идеи, почему это происходит и как я могу это решить?

Ответы [ 4 ]

3 голосов
/ 28 сентября 2011

Вы постоянно добавляете ссылки на один и тот же объект, поэтому в итоге получается список, содержащий несколько ссылок на один и тот же объект.

Попробуйте вместо этого добавить копии:

currentDate.setDate(currentDate.getDate()+1)
datesList.add(currentDate.clone());          // note the .clone()
3 голосов
/ 28 сентября 2011

Это потому, что переменная currentDate ссылается на один экземпляр Date, который вы добавляли в список много раз. Когда вы вызываете currentDate.setDate(currentDate.getDate() + 1), вы просто обновляете состояние этого же объекта, и каждый раз, когда вы вызываете datesList.add(currentDate), этот же объект добавляется в ArrayList.

Также обратите внимание, что setDate() и getDate() являются устаревшими методами. Вам следует использовать Calendar для манипулирования датами:

Calendar cal = Calendar.getInstance();
cal.set(2011, 5, 10);

ArrayList<Date> datesList = new ArrayList<Date>();

datesList.add(cal.getTime());

cal.add(Calendar.DATE, 1);
datesList.add(cal.getTime());

cal.add(Calendar.DATE, 1);
datesList.add(cal.getTime());

System.out.println( datesList.toString());

или, что еще лучше, Joda Time .

0 голосов
/ 28 сентября 2011
int dateNum = 3;
ArrayList<Date> datesList = new ArrayList();

for(int x = 0; x < dateNum; x++){
   Date currentDate = new Date("6/10/2011"); //Creating a new object so your not pointing to the same one in memory
   currentDate.setDate(currentDate.getDate()+1);
   datesList.add(currentDate);
}

   System.out.println( datesList.toString());
0 голосов
/ 28 сентября 2011

Список datesList имеет одинаковый экземпляр во всех позициях. Это тот же экземпляр Date, экземпляр которого создан в Date currentDate = new Date("6/10/2011");. Попробуйте клонировать его с помощью clone() и измените и добавьте каждый клон в список.

   ArrayList<Date> datesList = new ArrayList();

   Date currentDate = new Date("6/10/2011"); ;
   currentDate.setDate(currentDate.getDate()+1);
   datesList.add(currentDate);

   currentDate = currentDate.clone();
   currentDate.setDate(currentDate.getDate()+1);
   datesList.add(currentDate);

   currentDate = currentDate.clone();
   currentDate.setDate(currentDate.getDate()+1);
   datesList.add(currentDate);

   System.out.println( datesList.toString());

Делая это, каждый раз, когда вы делаете currentDate = currentDate.clone(), вы присваиваете новый экземпляр Date с такими же свойствами переменной currentDate, не изменяя при этом уже исходные экземпляры. добавлен в список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...