微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据特定值对 ArrayList<DayOfWeek> 进行排序

如何解决根据特定值对 ArrayList<DayOfWeek> 进行排序

我有一个 ArrayList<DayOfWeek> 比方说 ["MONDAY","WednESDAY","FRIDAY"]

我的目标是以循环方式根据 DayOfTheWeek 对其进行排序。

输入:"WednESDAY"

排序列表:["WednESDAY","FRIDAY","MONDAY"]

该列表保证从周一到周日排序。不能保证输入的日期在列表中,在这种情况下,排序从列表中存在的下一个值开始。

解决方法

我建议使用类似的方法:

how to order Arrays value as circular format in java?

其中每个 DayOfWeek 都有自己的 ID 编号,对应于其在排序中的预期位置,因此您可以围绕这些编号旋转。

,

Collections#rotate

演示:

import java.time.DayOfWeek;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<DayOfWeek> list = new ArrayList<>(List.of(DayOfWeek.MONDAY,DayOfWeek.TUESDAY,DayOfWeek.WEDNESDAY,DayOfWeek.THURSDAY,DayOfWeek.FRIDAY,DayOfWeek.SUNDAY));

        Collections.rotate(list,list.size() - list.indexOf(DayOfWeek.WEDNESDAY));

        System.out.println(list);
    }
}

输出:

[WEDNESDAY,THURSDAY,FRIDAY,SUNDAY,MONDAY,TUESDAY]

互动:

import java.time.DayOfWeek;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        List<DayOfWeek> list = new ArrayList<>(List.of(DayOfWeek.MONDAY,DayOfWeek.SUNDAY));

        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter the day: ");
        String day = scanner.nextLine();

        try {
            Collections.rotate(list,list.size() - list.indexOf(DayOfWeek.valueOf(day.toUpperCase())));
            System.out.println(list);
        } catch (IllegalArgumentException e) {
            System.out.println("Invalid input");
        }
    }
}

示例运行:

Enter the day: wednesday
[WEDNESDAY,TUESDAY]
,

其他答案已经给出了正确的想法:使用 Collections.rotate()。这只是为了考虑评论中的信息:

该列表保证从周一到周日排序。这 不保证输入日期在列表中,在这种情况下 排序从列表中的下一个值开始。

    ArrayList<DayOfWeek> list  = new ArrayList<>(List.of(
            DayOfWeek.MONDAY,DayOfWeek.FRIDAY));
    DayOfWeek input = DayOfWeek.TUESDAY;
    
    int indexOfDesiredFirstDay = Collections.binarySearch(list,input);
    if (indexOfDesiredFirstDay < 0) {
        indexOfDesiredFirstDay = -indexOfDesiredFirstDay - 1;
    }
    Collections.rotate(list,-indexOfDesiredFirstDay);
    
    System.out.println(list);

本例中的输出:

[星期三、星期五、星期一]

由于列表永远不会超过7个元素,所以我们不需要二分查找的效率,但是Collections.binarySearch()仍然是一种方便的方法,可以找到我们想要排在第一位的元素的索引回转。 rotate() 接受负的旋转量,因此我们只需否定(反转其符号)索引并将其传递给该方法。计算出的索引可能超出了列表的末尾,但 rotate() 也可以处理,所以没关系。

,

由于输入列表中可能缺少输入的日期,因此需要使用Collections.rotate对工作日的完整列表进行排序,然后通过输入列表进行过滤:

public static List<DayOfWeek> orderWithDayFirst(DayOfWeek first,List<DayOfWeek> dows) {
    List<DayOfWeek> fullWeek = Arrays.asList(DayOfWeek.values());
    Collections.rotate(fullWeek,-first.ordinal());
    return fullWeek.stream().filter(dows::contains).collect(Collectors.toList());
}

测试:

// Sunday is available
System.out.println(orderWithDayFirst(
        DayOfWeek.SUNDAY,Arrays.asList(DayOfWeek.MONDAY,DayOfWeek.SATURDAY,DayOfWeek.SUNDAY,DayOfWeek.TUESDAY)));

System.out.println("====");

// No Friday
System.out.println(orderWithDayFirst(
        DayOfWeek.FRIDAY,DayOfWeek.TUESDAY)));

输出

[SUNDAY,TUESDAY,SATURDAY]
====
[SATURDAY,TUESDAY]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。