java - 将轮类时间转换并打印为营业时间

标签 java

这就是我必须处理的事情,我有 一家有多个轮类时间的餐厅:

  1. 周一至周六

    • 上午 9 点至下午 2 点
  2. 周一至周五

    • 下午 4 点至晚上 9 点
  3. 星期五

    • 中午 12 点至下午 5 点
    • 注意:周五的营业时间为上午 9 点至晚上 9 点(三类制,上午 9 点至下午 2 点、中午 12 点至下午 5 点以及下午 4 点至晚上 9 点)
  4. 星期六

    • 下午 2 点至晚上 7 点
    • 注意:周六的营业时间为上午 9 点至晚上 7 点(两类倒,上午 9 点至下午 2 点以及下午 2 点至晚上 7 点)
<小时/>

我需要将这些轮类时间转换为工作时间,因此输出应如下所示:

周一至周四

  • 上午 9 点至下午 2 点

  • 下午 4 点至晚上 9 点

周五

  • 上午 9 点至晚上 9 点

星期六

  • 上午 9 点至晚上 7 点

周日

  • 已关闭
<小时/>

我有 2 个 .java 文件:ShiftHour.Java

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

//do not modify
public class ShiftHour {
private Set<Integer> daysInWeek = new HashSet<Integer>(); //CALENDAR'S DAYINWEEK
private int startHour; //IN 24HR FORMAT (1 to 24)
private int endHour;

//helper methods
public Set<Integer> getDaysInWeek() {
    return daysInWeek;
}
public void setDaysInWeek(Set<Integer> daysInWeek) {
    this.daysInWeek = daysInWeek;
}
public int getStartHour() {
    return startHour;
}
public void setStartHour(int startHour) {
    this.startHour = startHour;
}
public int getEndHour() {
    return endHour;
}
public void setEndHour(int endHour) {
    this.endHour = endHour;
}


//methods that generate assignment
public static List<ShiftHour> initializeShiftHoursSetOne() {
    List<ShiftHour> shiftHours = new ArrayList<ShiftHour>(0);

    ShiftHour sh1 = new ShiftHour();
    sh1.getDaysInWeek().add(Calendar.MONDAY);
    sh1.getDaysInWeek().add(Calendar.TUESDAY);
    sh1.getDaysInWeek().add(Calendar.WEDNESDAY);
    sh1.getDaysInWeek().add(Calendar.THURSDAY);
    sh1.getDaysInWeek().add(Calendar.FRIDAY);
    sh1.getDaysInWeek().add(Calendar.SATURDAY);
    sh1.setStartHour(9);
    sh1.setEndHour(14);

    ShiftHour sh2 = new ShiftHour();
    sh2.getDaysInWeek().add(Calendar.MONDAY);
    sh2.getDaysInWeek().add(Calendar.TUESDAY);
    sh2.getDaysInWeek().add(Calendar.WEDNESDAY);
    sh2.getDaysInWeek().add(Calendar.THURSDAY);
    sh2.getDaysInWeek().add(Calendar.FRIDAY);
    sh2.setStartHour(16);
    sh2.setEndHour(21);

    ShiftHour sh3 = new ShiftHour();
    sh3.getDaysInWeek().add(Calendar.FRIDAY);
    sh3.setStartHour(12);
    sh3.setEndHour(17);

    ShiftHour sh4 = new ShiftHour();
    sh4.getDaysInWeek().add(Calendar.SATURDAY);
    sh4.setStartHour(14);
    sh4.setEndHour(19);

    shiftHours.add(sh1);
    shiftHours.add(sh2);
    shiftHours.add(sh3);
    shiftHours.add(sh4);

    return shiftHours;

}

public static List<ShiftHour> initializeShiftHoursSetTwo() {
    List<ShiftHour> shiftHours = new ArrayList<ShiftHour>(0);

    ShiftHour sh1 = new ShiftHour();
    sh1.getDaysInWeek().add(Calendar.MONDAY);
    sh1.getDaysInWeek().add(Calendar.TUESDAY);
    sh1.getDaysInWeek().add(Calendar.THURSDAY);
    sh1.getDaysInWeek().add(Calendar.FRIDAY);
    sh1.getDaysInWeek().add(Calendar.SATURDAY);
    sh1.setStartHour(9);
    sh1.setEndHour(14);

    ShiftHour sh2 = new ShiftHour();
    sh2.getDaysInWeek().add(Calendar.MONDAY);
    sh2.getDaysInWeek().add(Calendar.TUESDAY);
    sh2.getDaysInWeek().add(Calendar.WEDNESDAY);
    sh2.getDaysInWeek().add(Calendar.THURSDAY);
    sh2.getDaysInWeek().add(Calendar.FRIDAY);
    sh2.setStartHour(16);
    sh2.setEndHour(21);

    ShiftHour sh3 = new ShiftHour();
    sh3.getDaysInWeek().add(Calendar.WEDNESDAY);
    sh3.setStartHour(12);
    sh3.setEndHour(17);

    ShiftHour sh4 = new ShiftHour();
    sh4.getDaysInWeek().add(Calendar.SATURDAY);
    sh4.setStartHour(15);
    sh4.setEndHour(19);

    ShiftHour sh5 = new ShiftHour();
    sh5.getDaysInWeek().add(Calendar.MONDAY);
    sh5.setStartHour(8);
    sh5.setEndHour(19);

    shiftHours.add(sh1);
    shiftHours.add(sh2);
    shiftHours.add(sh3);
    shiftHours.add(sh4);
    shiftHours.add(sh5);

    return shiftHours;

}
}

和test.java

public class Test {
public static void main(String[] args) {
    //Initialize first set of data
    List<ShiftHour> shiftHours = ShiftHour.initializeShiftHoursSetOne();

    //WHERE THE SOLUTION SHOULD GO.

    //Additional set of data for verification
    shiftHours = ShiftHour.initializeShiftHoursSetTwo();
}
}

最佳答案

一旦它看起来像家庭作业,我就不想提供简单的复制粘贴解决方案

这是纯 java 实现,您可以使用它作为基础来使用您的数据类型实现您的实现:

public class ShiftHour {
    public static final int MONDAY = 0, TUESDAY = 1, WEDNESDAY = 2, THURSDAY = 3, FRIDAY = 4, SATURDAY = 5, SUNDAY = 6;
    private static final String[] names = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
    public static class OperatingHours {
        int[] hours = new int[7];
        public void addShift(final int start, final int end, final int... days) {
            for (int i = start; i <= end; i++) {
                for (final int w : days)
                    hours[w] |= (1 << i);
        }

        public void printHours() {
            final StringBuilder sb = new StringBuilder();
            String prevDay = getDay(hours[0]);
            String startDay = names[0];
            String endDay = names[0];
            for (int i = 1; i < 7; i++) {
                final String day = getDay(hours[i]);
                if (day.equals(prevDay)) endDay = names[i];
                else {
                    appendDay(sb, startDay, endDay, prevDay);
                    prevDay = day;
                    startDay = endDay = names[i];
                }
            }
            appendDay(sb, startDay, endDay, prevDay);
            System.out.println(sb.toString());
        }

        String getDay(final int m) {
            final StringBuilder sb = new StringBuilder();
            int startHour = -1;
            int endHour = -1;
            for (int i = 0; i <= 24; i++) {
                if (((1 << i) & m) > 0) {
                    if (startHour == -1) startHour = i;
                    endHour = i;
                } else if (startHour >= 0) {
                    sb.append("\t" + formatHour(startHour) + " to " + formatHour(endHour) + "\n");
                    startHour = endHour = -1;
                }
            }
            if (startHour >= 0) sb.append("\t" + formatHour(startHour) + " to " + formatHour(endHour) + "\n");
            return sb.toString();
        }

        void appendDay(final StringBuilder sb, final String startDay, final String endDay, final String prevDay) {
            sb.append(startDay + (startDay.equals(endDay) ? "" : ("-" + endDay)) + "\n" + (prevDay.equals("") ? "\tClosed\n" : prevDay));
        }

        String formatHour(final int h) {
            if (h == 0) return "12AM";
            if (h < 12) return h + "AM";
            if (h == 12) return "12PM";
            if (h < 24) return (h - 12) + "PM";
            return "12AM"; // 24 hours is midnight again
        }
    };

    public static void main(final String[] args) {
        final OperatingHours hours = new OperatingHours();
        hours.addShift(9, 14, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY);
        hours.addShift(16, 21, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY);
        hours.addShift(12, 17, FRIDAY);
        hours.addShift(14, 19, SATURDAY);

        hours.printHours();
    }
}

输出:

Monday-Thursday
    9AM to 2PM
    4PM to 9PM
Friday
    9AM to 9PM
Saturday
    9AM to 7PM
Sunday
    Closed

关于java - 将轮类时间转换并打印为营业时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35948861/

相关文章:

java - 如何在java中旋转游戏中的图像?

java - 使用 AutoValue 时无法将 JSON 转换为 ArrayList

java - 添加 MongoDB 策略提供程序扩展后出现 RuntimeException

java - RoboVM 插件 0.0.11 不适用于 eclipse

java - 错误 : Module not specified (IntelliJ IDEA)

java - 是否有用于添加或删除 SWT Combo 项目的监听器?

java - 文件无法正确读取

java - 映射非实体类变量名,如 javax.persistence.metamodel 中

java - 为什么 Selenium 在 Google 主页上识别一个按钮而不是两个按钮

java - 内存不足,无法继续运行 Java 运行时环境