猿问

JavaFX:在迭代时删除特殊日期

我知道,有很多示例如何在迭代列表时从列表中删除某些内容,但这不是重点。

我正在尝试自动化记录我的工作的流程(最终应该打印到类似于01.01.2019 - Tuesday的文档中)。为此,我有一个带有两个日期选择器的用户界面。选择两个不同的日期并进行比较后,我知道这些日期之间有多少天。

现在出现以下问题:

我将两个日期之间的所有日期添加到列表中。之后,我尝试阻止一些特定的日子(总是同一天:星期一星期六星期日)。这些日子不应该再出现在列表中。

我尝试过在迭代列表时将值从列表中删除之类的操作。但它并没有按照我期望的方式工作。

例子:

我选择17.09.2019作为开始,24.09.2019作为结束。预期输出应该是:

平日:星期二
日期:2019-09-18
平日:星期三
日期:2019-09-19
平日:星期四
日期:2019-09-20
平日:星期五
日期:2019-09-24
平日:星期二

但如果我运行我的代码,输出是:

工作日: 星期二
日期: 2019-09-18
工作日: 星期三
日期
: 2019-09-19 工作日: 星期四
日期: 2019-09-20
工作日: 星期五
日期: 2019-09-21
工作日: 星期五
日期: 2019-09-22
工作日:星期五
日期:2019-09-23
工作日:星期五
日期:2019-09-24
工作日:星期二

你可以看到。星期六、星期日和星期一这个词将被删除,但它仍然在列表中。

代码:


long daysBetween = ChronoUnit.DAYS.between(dateBeginPicker.getValue(), dateEndPicker.getValue());

                int db = Math.toIntExact(daysBetween);


                String day = "";

                List<LocalDate> dateList = new ArrayList<>();

                LocalDate dateAfter = null;


                for (int i = 0; i <= db; i++) {

                    dateAfter = dateBeginPicker.getValue().plusDays(i);

                    dateList.add(dateAfter);

                }


                for (Iterator<LocalDate> iterator = dateList.iterator(); iterator.hasNext();) {

                    LocalDate date = iterator.next();


                    if (date.getDayOfWeek().equals(DayOfWeek.SATURDAY) || date.getDayOfWeek().equals(DayOfWeek.SUNDAY) || date.getDayOfWeek().equals(DayOfWeek.MONDAY)) {

                        iterator.remove();

                        dateList.remove(date);

                    }

                    else {

                        day = date.getDayOfWeek().toString();

                    }


                    System.out.println("Date: " + date);

                    System.out.println("Weekday: " + day);

                }

我最终期望的是,每个星期一、星期六和星期日应该从列表中删除,并且输出应该是正确的(如我的示例中所示)。


元芳怎么了
浏览 98回答 2
2回答

MMTTMM

您的 System.out.println() 命令位于 for 循环内,但位于 else 块之外。这就是显示所有日期的原因。只需将这两行移到 else 块内,您就会得到您想要的输出。

SMILET

我很高兴你解决了你的问题。我想补充三点。如果您愿意,可以使用流。您不应该在Iterator和 上同时调用remove&nbsp;List。我对你的代码出了什么问题的解释。1.您可以使用流。在 Java 9 及更高版本中最简单:&nbsp; &nbsp; LocalDate begin = LocalDate.of(2019, Month.SEPTEMBER, 17);&nbsp; &nbsp; LocalDate end = LocalDate.of(2019, Month.SEPTEMBER, 24);&nbsp; &nbsp; final Set<DayOfWeek> blockedDays = EnumSet.of(DayOfWeek.MONDAY, DayOfWeek.SATURDAY, DayOfWeek.SUNDAY);&nbsp; &nbsp; List<LocalDate> dateList = begin.datesUntil(end.plusDays(1))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .filter(ld -> ! blockedDays.contains(ld.getDayOfWeek()))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.toList());&nbsp; &nbsp; dateList.forEach(ld -> {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(ld.getDayOfWeek());&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(ld);&nbsp; &nbsp; });输出是:TUESDAY2019-09-17WEDNESDAY2019-09-18THURSDAY2019-09-19FRIDAY2019-09-20TUESDAY2019-09-242.不要打电话dateList.remove()。您拨打的电话iterator.remove()已将该日期从列表中删除。所以你的调用dateList.remove()什么也不做。这是一种运气。如果它找到要删除的元素,则会在后续调用时Iterator抛出 a 。除非通过迭代器,否则不允许在迭代集合时修改集合,并且尝试执行此操作的结果是未定义的。因此,请从代码中删除该调用。ConcurrentModificationExceptionhasNext()3. 你的代码出了什么问题?你的输出看起来很有趣。对于被阻止的日子FRIDAY是与日期一起打印的,即星期几和日期不匹配。发生的情况是:您正确设置了date列表中的日期。由于这一天是封锁日,您执行了if该语句的一部分if,从列表中删除了该日期。您没有执行该else部分,因此day与上一次迭代相比没有变化FRIDAY。if您无条件打印的语句后date,封锁日期(依次为2019-09-21、2019-09-22和2019-09-23),以及day(FRIDAY每次)。
随时随地看视频慕课网APP

相关分类

Java
我要回答