【问题标题】:Get first subsequent DayOfWeek from list从列表中获取第一个后续 DayOfWeek
【发布时间】:2021-09-03 17:36:12
【问题描述】:

对于日程应用程序,我需要从列表中确定今天之后的第一天,然后继续。比如:

DayOfWeek today -> SATURDAY
val list1 = listOf(MONDAY, TUESDAY, FRIDAY)

DayOfWeek today -> WEDNESDAY
val list2 = listOf(TUESDAY)

然后逻辑必须给我 MONDAY 用于 list1 和 TUESDAY 用于 list2。我知道 DayOfWeek 枚举类和 TemporalAdjusters.nextOrSame() 上的 .plusDays() 函数,但是您必须提供 DayOfWeek,我不知道,因为我试图在列表中找到它。

【问题讨论】:

  • 如果今天是MONDAY,并且列表中有MONDAYTUESDAY,您希望输出是什么?
  • 星期二,因为这是星期一之后的第一个第二天。 (删除了我之前的错误评论)。
  • 但是 Ole V.V. 的回答产生了 MONDAY,你接受了吗?
  • 我简化了我的问题,所以它会关注算法/使用哪个收集功能。 Next 和 nextOrSame 对我的逻辑都很有用。你和 Olle 的回答足够引导我朝着正确的方向前进。

标签: java datetime kotlin java-time dayofweek


【解决方案1】:
    LocalDate today = LocalDate.now(ZoneId.systemDefault());
    List<DayOfWeek> list = List.of(DayOfWeek.MONDAY, DayOfWeek.TUESDAY, DayOfWeek.FRIDAY);
    
    DayOfWeek first = Collections.min(list,
            Comparator.comparing(dow -> today.with(TemporalAdjusters.nextOrSame(dow))));
    System.out.println(first);

今天运行时的输出(我所在时区的星期六):

星期一

我正在使用比较器来查询最小值,该比较器比较一周中下一次出现的日期(如果今天恰好是那一天)。由于星期一先到,这被认为是最低限度。我间接调用了您在列表的每个成员中提到的TemporalAdjusters.nextOrSame() 方法。这可能不是最省时的方法,但对于 20 个目的中的 19 个,我确信它没问题。它提供的代码很短,而且我觉得可读,这更重要。

如果今天是星期三?让我们尝试将today 设置为下周三:

    LocalDate today = LocalDate.of(2021, Month.JUNE, 23);

现在输出是:

星期五

【讨论】:

  • 正确...另外,import static java.time.DayOfWeek.*;,可以直接使用MONDAY,TUESDAY等,
  • 谢谢,这似乎有效。您是否碰巧知道您的答案的 Kotlin 变体?我的代码库完全是 Kotlin,所以更喜欢使用 Kotlin 替代品。如果不是,我会坚持使用好的旧 Java :)
  • 对不起,我不会写 Kotlin。我没想到翻译对一个这样做的人来说很难。
【解决方案2】:

这里是 Ole V.V.'s answer,翻译成 Kotlin 作为函数。

fun nextWeekDayInList(list: List<DayOfWeek>, today: LocalDate) =
    list.minByOrNull { dow ->
        today.with(TemporalAdjusters.nextOrSame(dow))
    }

如果列表为空,这将返回 null

用法:

println(nextWeekDayInList(
    listOf(DayOfWeek.MONDAY, DayOfWeek.TUESDAY, DayOfWeek.FRIDAY),
    today = LocalDate.now(ZoneId.systemDefault())
))

your recent comment来看,next可能比nextOrSame更合适。

【讨论】:

  • 谢谢,我已经尝试过使用 .first{..}、takeIf{..}、filterIndexed{..} 和其他一些集合函数,但 .minByOrNull{..} 似乎是正确的,不知道它的存在!
【解决方案3】:

我迟到了,但我已经创建了一个解决方案。所以,发布它。

package com.ubaid;

import lombok.extern.slf4j.Slf4j;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
public class Demo {

    public static void main(String[] args) {

        List<DayOfWeek> list = List.of(DayOfWeek.MONDAY, DayOfWeek.TUESDAY, DayOfWeek.FRIDAY);

        DayOfWeek nextDay = getFirstDayInListAfterTodayGoingForward(list);

        //will print MONDAY (today is SATURDAY)
        log.debug(String.valueOf(nextDay));

        list = List.of(DayOfWeek.TUESDAY);

        nextDay = getFirstDayInListAfterTodayGoingForward(list);
        //will print TUESDAY (today is SATURDAY)
        log.debug(String.valueOf(nextDay));
    }

    /**
     *
     * @param list of days of week
     * @return first day of week after today or today if today is present in the list
     */
    private static DayOfWeek getFirstDayInListAfterTodayGoingForward(List<DayOfWeek> list) {

        //MONDAY value is 1
        //  .
        //  .
        //SUNDAY value is 7

        //getting today value
        int todayVal = DayOfWeek.from(LocalDate.now()).getValue();

        //sort the DAYS according to their ordinal values
        List<Integer> daysInListVal = list
            .stream()
            .map(DayOfWeek::getValue)
            .sorted()
            .collect(Collectors.toList());

        if (daysInListVal.contains(todayVal)) {
            return DayOfWeek.of(todayVal);
        }

        //now get the DAY value which is next to today DAY
        //If next value is not present then pick the first item of sorted list
        return daysInListVal
            .stream()
            .filter(dayInList -> dayInList > todayVal)
            .findFirst()
            .map(DayOfWeek::of)
            .orElse(DayOfWeek.of(daysInListVal.stream().findFirst().orElseThrow()));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2011-10-13
    • 2013-09-03
    相关资源
    最近更新 更多