Java 奇怪的arraylist结果?
在前3个月内,我将每个星期六和星期日添加到数组列表中 但是,当我遍历数组时,为了检查值是否确实正确,我似乎只得到了几个元素(虽然数组的大小仍然正确->例如,数组中只有两个元素,而大小是26) 有什么帮助吗Java 奇怪的arraylist结果?,java,android,arraylist,calendarview,Java,Android,Arraylist,Calendarview,在前3个月内,我将每个星期六和星期日添加到数组列表中 但是,当我遍历数组时,为了检查值是否确实正确,我似乎只得到了几个元素(虽然数组的大小仍然正确->例如,数组中只有两个元素,而大小是26) 有什么帮助吗 info.setContentView(R.layout.calendar_dialog); CalendarView calendarView = info.findViewById(R.id.calendarView); Calendar currentD
info.setContentView(R.layout.calendar_dialog);
CalendarView calendarView = info.findViewById(R.id.calendarView);
Calendar currentDate = Calendar.getInstance();
Calendar max = Calendar.getInstance();
max.add(Calendar.MONTH,3);
calendarView.setMinimumDate(currentDate);
calendarView.setMaximumDate(max);
Calendar temp = Calendar.getInstance();
ArrayList<Calendar> calendars = new ArrayList<>();
calendars.add(temp);
while(temp.get(Calendar.MONTH) < max.get(Calendar.MONTH)) {
temp.add(Calendar.DATE, 1);
if(temp.get(Calendar.DAY_OF_WEEK) == 1 || temp.get(Calendar.DAY_OF_WEEK) == 7) {
calendars.add(temp);
}
}
calendarView.setDisabledDays(calendars);
info.findViewById(R.id.calendar_ok).setOnClickListener(v -> info.dismiss());
info.show();
info.setContentView(R.layout.calendar\u对话框);
CalendarView CalendarView=info.findViewById(R.id.CalendarView);
Calendar currentDate=Calendar.getInstance();
Calendar max=Calendar.getInstance();
最大添加(日历月,3);
calendarView.setMinimumDate(当前日期);
calendarView.setMaximumDate(最大值);
Calendar temp=Calendar.getInstance();
ArrayList日历=新建ArrayList();
日历。添加(临时);
while(临时获取(日历月)info.disease());
info.show();
您正在一次又一次地将同一对象(temp
)添加到arraylist。
改为这样做:
calendars.add(temp.clone());
你有两个错误: 1) 当(临时获取(日历月)
2) 您不应反复添加同一个日历实例:
calendars.add(temp)代码>。相反,对实例进行深度克隆(temp.clone()
),并每次向列表中添加一个具有正确值的新实例。问题在于,在temp
变量中只使用日历的单个实例。您可以在的每次迭代中修改它,同时
循环并将相同的引用存储在日历
列表中
最后,calendars
列表包含许多(您说26个)项,但它们都引用了在每次迭代中修改的完全相同的Calendar
实例
解决方案是在将日历实例添加到列表之前构建全新的日历实例:
...
if(temp.get(Calendar.DAY_OF_WEEK) == 1 || temp.get(Calendar.DAY_OF_WEEK) == 7){
calendars.add((Calendar)temp.clone());
}
...
缺少强制转换,它应该是:calendars.add((Calendar)temp.clone())代码>为什么在我的回答之后,你会将重复回答标记为已接受?(顺便说一句,不太准确)