Java 根据日期按顺序转换arraylist元素

Java 根据日期按顺序转换arraylist元素,java,java-6,Java,Java 6,下面是数据库的输出。这些顺序顺序不可能每次都相同。这里的日期不是按顺序排列的。我需要按顺序安排这些天 ArrayList dayList= [ MONDAY : 9:00AM - 5:00PM , TUESDAY : 9:00AM - 5:00PM , WEDNESDAY: 9:00AM - 5:00PM , FRIDAY : 9:00AM - 5:00PM, THURSDAY : 9:00AM - 5:00PM , SATURDAY : C L O S E D , SUNDAY

下面是数据库的输出。这些顺序顺序不可能每次都相同。这里的日期不是按顺序排列的。我需要按顺序安排这些天

ArrayList dayList= [ MONDAY   : 9:00AM - 5:00PM , TUESDAY  : 9:00AM - 5:00PM , WEDNESDAY: 9:00AM - 5:00PM , FRIDAY   : 9:00AM - 5:00PM,  THURSDAY : 9:00AM - 5:00PM , SATURDAY : C L O S E D  , SUNDAY   : C L O S E D , APPOINTMENT REQUIREMENT]
我需要按如下顺序转换输出:

[ MONDAY   : 9:00AM - 5:00PM , TUESDAY  : 9:00AM - 5:00PM , WEDNESDAY: 9:00AM - 5:00PM , THURSDAY : 9:00AM - 5:00PM , FRIDAY   : 9:00AM - 5:00PM,  SATURDAY : C L O S E D  , SUNDAY   : C L O S E D , APPOINTMENT REQUIREMENT]

像这样的东西可能有用。它使用正则表达式提取日期名称,并从Java8TimeAPI中从日期名称中获取日期编号

List<String> dayList = new ArrayList<>(Arrays.asList(
        "SATURDAY : C L O S E D",
        "TUESDAY  : 9:00AM - 5:00PM",
        "FRIDAY   : 9:00AM - 5:00PM",
        "MONDAY   : 9:00AM - 5:00PM",
        "SUNDAY   : C L O S E D",
        "WEDNESDAY: 9:00AM - 5:00PM",
        "APPOINTMENT REQUIREMENT",
        "THURSDAY : 9:00AM - 5:00PM"));

// Sort list by day name
Pattern p = Pattern.compile("^(\\w+DAY)\\s*:");
dayList.sort(Comparator.<String>comparingInt(s -> {
    Matcher m = p.matcher(s);
    return (m.find() ? DayOfWeek.valueOf(m.group(1)).getValue() : 8);
}));

// Print the sorted list
dayList.forEach(System.out::println);

更新Java 5+解决方案,输出与上述相同:

final class DayComparator implements Comparator<String> {
    private final Pattern p = Pattern.compile(
            "^(?:(MON)|(TUES)|(WEDNES)|(THURS)|(FRI)|(SATUR)|(SUN))DAY\\s*:");
    public int compare(String s1, String s2) {
        return dayValue(s1) - dayValue(s2);
    }
    private int dayValue(String s) {
        Matcher m = this.p.matcher(s);
        if (m.find())
            for (int i = 1; ; i++)
                if (m.start(i) != -1)
                    return i;
        return 8;
    }
}
最终类DayComparator实现Comparator{
私有最终模式p=Pattern.compile(
“^(?(星期一)|(星期二)|(星期三)|(星期四)|(星期五)|(星期六)|(星期日))日\\s*:”;
公共整数比较(字符串s1、字符串s2){
返回dayValue(s1)-dayValue(s2);
}
私有整数日值(字符串s){
匹配器m=此.p.匹配器;
if(m.find())
for(int i=1;i++)
如果(m.start(i)!=-1)
返回i;
返回8;
}
}
List dayList=新建ArrayList(Arrays.asList(
“星期六:C L O S E D”,
“星期二:上午9:00-下午5:00”,
“星期五:上午9:00-下午5:00”,
“星期一:上午9:00-下午5:00”,
“星期日:C L O S E D”,
“星期三:上午9:00-下午5:00”,
“任命要求”,
"星期四:上午九时至下午五时);;
//按日期名称对列表排序
sort(dayList,newdaycomarator());
//打印已排序的列表
for(字符串s:dayList)
系统输出打印项次;

这在Java 6中不起作用,但这一概念仍然适用,并且很容易翻译:

Java 8流替代方案:

private static final List<String> DATES =
        List.of("MONDAY   : 9:00AM - 5:00PM",
                "TUESDAY  : 9:00AM - 5:00PM",
                "WEDNESDAY: 9:00AM - 5:00PM",
                "FRIDAY   : 9:00AM - 5:00PM",
                "THURSDAY : 9:00AM - 5:00PM",
                "SATURDAY : C L O S E D ",
                "SUNDAY   : C L O S E D",
                "APPOINTMENT REQUIREMENT");

private static List<String> getSortedDates() {
    EnumSet<DayOfWeek> dayOfWeeks = EnumSet.allOf(DayOfWeek.class);
    return DATES.stream()
            .map(p -> dayOfWeeks.stream()
                    .filter(q -> p.startsWith(q.name()))
                    .findAny()
                    .map(r -> new SimpleImmutableEntry<>(r.ordinal(), p))
                    .orElse(new SimpleImmutableEntry<>(dayOfWeeks.size(), p)))
            .sorted(Comparator.comparing(SimpleImmutableEntry::getKey))
            .map(SimpleImmutableEntry::getValue)
            .collect(Collectors.toList());
}

public static void main(String[] args) {
    getSortedDates().forEach(System.out::println);
}
私有静态最终列表日期=
名单(“星期一:上午9:00-下午5:00”,
“星期二:上午9:00-下午5:00”,
“星期三:上午9:00-下午5:00”,
“星期五:上午9:00-下午5:00”,
“周四:上午9:00-下午5:00”,
“星期六:C L O S E D”,
“星期日:C L O S E D”,
“任命要求”);
私有静态列表getSortedDates(){
EnumSet dayOfWeeks=EnumSet.allOf(DayOfWeek.class);
返回日期。stream()
.map(p->dayOfWeeks.stream()
.filter(q->p.startsWith(q.name()))
.findAny()
.map(r->newsimpleimutableentry(r.ordinal(),p))
.orElse(新的SimpleImmutableEntry(dayOfWeeks.size(),p)))
.sorted(Comparator.comparing(SimpleImmutableEntry::getKey))
.map(SimpleImutableEntry::getValue)
.collect(Collectors.toList());
}
公共静态void main(字符串[]args){
getSortedDates().forEach(System.out::println);
}

dayList
看起来像是
列表的
字符串
表示形式。您能否提供使用对象时的外观?你们有什么类型的?另外,最好是在
DB
端对这些项目进行排序。数组中的值是字符串吗?@preciousbetine:-是的,所有值都是Arraylist中的字符串。您需要首先解析这些字符串,以便知道日期。你尝试过什么?它可能被否决了,因为OP根本没有试图解决这个问题。答案很好,我想不出更好的答案,但标签上写着java-6,也许是编辑?这在java 6For java 6&7中不起作用,大多数java.time功能在Three Ten Backport项目中可用。谢谢。但是有适用于Java6的示例代码吗?@Ravikanth-Huh?!?我刚刚添加了适用于Java5+的代码(这意味着适用于Java5和任何更高版本,包括Java5、6、7、8、9、10、11、12等)。谢谢。有运行Java6的示例代码吗?
private static final List<String> DATES =
        List.of("MONDAY   : 9:00AM - 5:00PM",
                "TUESDAY  : 9:00AM - 5:00PM",
                "WEDNESDAY: 9:00AM - 5:00PM",
                "FRIDAY   : 9:00AM - 5:00PM",
                "THURSDAY : 9:00AM - 5:00PM",
                "SATURDAY : C L O S E D ",
                "SUNDAY   : C L O S E D",
                "APPOINTMENT REQUIREMENT");

private static List<String> getSortedDates() {
    EnumSet<DayOfWeek> dayOfWeeks = EnumSet.allOf(DayOfWeek.class);
    return DATES.stream()
            .map(p -> dayOfWeeks.stream()
                    .filter(q -> p.startsWith(q.name()))
                    .findAny()
                    .map(r -> new SimpleImmutableEntry<>(r.ordinal(), p))
                    .orElse(new SimpleImmutableEntry<>(dayOfWeeks.size(), p)))
            .sorted(Comparator.comparing(SimpleImmutableEntry::getKey))
            .map(SimpleImmutableEntry::getValue)
            .collect(Collectors.toList());
}

public static void main(String[] args) {
    getSortedDates().forEach(System.out::println);
}