奇怪的数组列表结果?
Weird arraylist result?
我将在前 3 个月的每个星期六和星期日日期添加到数组列表中。
但是,当我遍历数组时,为了检查值是否真的正确,我似乎只得到了几个元素(尽管数组的大小仍然正确 -> 例如,只有两个元素数组,而大小为 26)。
有什么帮助吗?
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();
您一遍又一遍地向数组列表添加相同的对象 (temp
)。
改为这样做:
calendars.add(temp.clone());
你有两个错误:
1) 条件while(temp.get(Calendar.MONTH) < max.get(Calendar.MONTH))
没有考虑年的变化,如果周期结束于新的一年final/beginning。比较 2018 年 11 月和 2019 年 2 月将因该条件而失败。
2) 您不应一遍又一遍地添加相同的日历实例:calendars.add(temp);
。相反,对实例进行深度克隆 (temp.clone()
),并在列表中每次添加一个具有正确值的新实例。
问题是您在 temp
变量中只使用了 Calendar
的单个实例。您在 while
循环的每次迭代中修改它,并将相同的引用存储在 calendars
列表中。
最后,calendars
列表包含许多(你说是 26)项,但它们都引用完全相同的 Calendar
实例,该实例在每次迭代中都被修改。
解决方案是在将其添加到列表之前构建全新的日历实例:
...
if(temp.get(Calendar.DAY_OF_WEEK) == 1 || temp.get(Calendar.DAY_OF_WEEK) == 7){
calendars.add((Calendar)temp.clone());
}
...
我将在前 3 个月的每个星期六和星期日日期添加到数组列表中。
但是,当我遍历数组时,为了检查值是否真的正确,我似乎只得到了几个元素(尽管数组的大小仍然正确 -> 例如,只有两个元素数组,而大小为 26)。
有什么帮助吗?
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();
您一遍又一遍地向数组列表添加相同的对象 (temp
)。
改为这样做:
calendars.add(temp.clone());
你有两个错误:
1) 条件while(temp.get(Calendar.MONTH) < max.get(Calendar.MONTH))
没有考虑年的变化,如果周期结束于新的一年final/beginning。比较 2018 年 11 月和 2019 年 2 月将因该条件而失败。
2) 您不应一遍又一遍地添加相同的日历实例:calendars.add(temp);
。相反,对实例进行深度克隆 (temp.clone()
),并在列表中每次添加一个具有正确值的新实例。
问题是您在 temp
变量中只使用了 Calendar
的单个实例。您在 while
循环的每次迭代中修改它,并将相同的引用存储在 calendars
列表中。
最后,calendars
列表包含许多(你说是 26)项,但它们都引用完全相同的 Calendar
实例,该实例在每次迭代中都被修改。
解决方案是在将其添加到列表之前构建全新的日历实例:
...
if(temp.get(Calendar.DAY_OF_WEEK) == 1 || temp.get(Calendar.DAY_OF_WEEK) == 7){
calendars.add((Calendar)temp.clone());
}
...