亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JavaFX:在迭代時刪除特殊日期

JavaFX:在迭代時刪除特殊日期

元芳怎么了 2023-08-04 10:02:40
我知道,有很多示例如何在迭代列表時從列表中刪除某些內容,但這不是重點。我正在嘗試自動化記錄我的工作的流程(最終應該打印到類似于01.01.2019 - Tuesday的文檔中)。為此,我有一個帶有兩個日期選擇器的用戶界面。選擇兩個不同的日期并進行比較后,我知道這些日期之間有多少天?,F在出現以下問題:我將兩個日期之間的所有日期添加到列表中。之后,我嘗試阻止一些特定的日子(總是同一天:星期一、星期六和星期日)。這些日子不應該再出現在列表中。我嘗試過在迭代列表時將值從列表中刪除之類的操作。但它并沒有按照我期望的方式工作。例子:我選擇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 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號