为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

元芳怎么了 2023-08-04 10:02:40
我知道,有很多示例如何在迭代列表时从列表中删除某些内容,但这不是重点。我正在尝试自动化记录我的工作的流程(最终应该打印到类似于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);                }我最终期望的是,每个星期一、星期六和星期日应该从列表中删除,并且输出应该是正确的(如我的示例中所示)。
查看完整描述

2 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

您的 System.out.println() 命令位于 for 循环内,但位于 else 块之外。这就是显示所有日期的原因。

只需将这两行移到 else 块内,您就会得到您想要的输出。


查看完整回答
反对 回复 2023-08-04
?
SMILET

TA贡献1796条经验 获得超4个赞

我很高兴你解决了你的问题。我想补充三点。

  1. 如果您愿意,可以使用流。

  2. 您不应该在Iterator和 上同时调用remove List

  3. 我对你的代码出了什么问题的解释。

1.您可以使用流。在 Java 9 及更高版本中最简单:

    LocalDate begin = LocalDate.of(2019, Month.SEPTEMBER, 17);

    LocalDate end = LocalDate.of(2019, Month.SEPTEMBER, 24);


    final Set<DayOfWeek> blockedDays = EnumSet.of(DayOfWeek.MONDAY, DayOfWeek.SATURDAY, DayOfWeek.SUNDAY);

    List<LocalDate> dateList = begin.datesUntil(end.plusDays(1))

            .filter(ld -> ! blockedDays.contains(ld.getDayOfWeek()))

            .collect(Collectors.toList());


    dateList.forEach(ld -> {

        System.out.println(ld.getDayOfWeek());

        System.out.println(ld);

    });

输出是:


TUESDAY

2019-09-17

WEDNESDAY

2019-09-18

THURSDAY

2019-09-19

FRIDAY

2019-09-20

TUESDAY

2019-09-24

2.不要打电话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每次)。


查看完整回答
反对 回复 2023-08-04
  • 2 回答
  • 0 关注
  • 97 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信