Сортировка Дней недели по времени - PullRequest
0 голосов
/ 20 декабря 2018

Я хочу, чтобы сортировка началась в воскресенье в 00:00.Моя проблема в том, что ноль этого кода начинается в четверг в 8:00.Я сортирую, получая минуты, но ноль начинается с Чт 8: 00.

Пока это мой код.

String[] lines = S.split("\n");
System.out.println(Arrays.toString(lines));

int longest = 0;
try {
    for (int i = 0; i < lines.length - 1; i++) {
        SimpleDateFormat formatter = new SimpleDateFormat("EEE HH:mm-HH:mm", Locale.US);
        long diffMinutes;
        diffMinutes = TimeUnit.MILLISECONDS.toMinutes(
                            formatter.parse(lines[i + 1]).getTime() - 
                            formatter.parse(lines[i]).getTime());
        if (longest < diffMinutes) {
            longest = (int) diffMinutes;
        }
    }
} catch (ParseException e) {
    e.printStackTrace();
}
return longest;

Функция принимает строку типа

"Mon 01:00-23:00\\nTue 01:00-23:00\\nWed 01:00-23:00\\nThu 01:00-23:00\\nFri 01:00-23:00\\nSat 01:00-23:00\\nSun 01:00-21:00"

Программа разрезает строку и сохраняет ее в строках массива, затем я пытаюсь ее отсортировать.

1 Ответ

0 голосов
/ 20 декабря 2018

Я думаю, что эту проблему можно решить, применив еще несколько разбиений, из-за того, что вы String представляете период в форме от-до вместо абсолютного значения, например 1320 (минут) .Я бы использовал java.time, особенно LocalTime и Duration для правильного вычисления и сравнения.

Мой код в основном делает следующее (см. Комментарии к коду), используя вспомогательные методы:

  1. разбивает входные данные на "\n"
  2. разбивает каждый результат первого шага на пробел, чтобы отделить день недели от времени дня
  3. делит второй результатвторое разделение на "-" для получения времени дня
  4. преобразует результаты в соответствующие объекты
  5. сохраняет их в соответствующей структуре данных
  6. находит максимальные длительности

Вот что я придумал:

import java.time.DayOfWeek;
import java.time.Duration;
import java.time.LocalTime;
import java.time.format.TextStyle;
import java.util.Collections;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

class WeekdayDurationHandler {

    public static void main(String[] args) {
        // input String splitting...
        String input = "Mon 01:00-23:00\nTue 01:00-23:00\nWed 01:00-23:00\nThu 01:00-23:00\nFri 01:00-23:00\nSat 01:00-23:00\nSun 01:00-21:00";
        String[] times = input.split("\n");

        // data structure for holding the durations per day
        Map<DayOfWeek, Duration> weekdayDurations = new TreeMap<>();

        // the result of the first splitting is unparseable, that's why some more
        // splitting is applied
        for (String s : times) {
            // separate the day of week from the time duration
            String[] sp = s.split(" ");
            // split the duration into "from" and "to" (time of day)
            String[] tp = sp[1].split("-");
            // parse the day of week into an appropriate object
            DayOfWeek dayOfWeek = parseDayOfWeek(sp[0]);
            // parse the times of day into appropriate objects
            LocalTime localTimeFrom = LocalTime.parse(tp[0]);
            LocalTime localTimeTo = LocalTime.parse(tp[1]);
            // calculate the duration between "from" and "to" time of day
            Duration duration = Duration.between(localTimeFrom, localTimeTo);
            // store them in the data structure
            weekdayDurations.put(dayOfWeek, duration);
        }

        // print them
        weekdayDurations.forEach((DayOfWeek dayOfWeek, Duration duration) -> {
            System.out.println(dayOfWeek.getDisplayName(TextStyle.FULL_STANDALONE, Locale.getDefault()) + ": "
                    + duration.toHours() + " hours (" + duration.toMinutes() + " minutes)");
        });

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

        // then print the maximum durations found
        findMaxDurationsFrom(weekdayDurations).forEach((DayOfWeek dayOfWeek, Duration duration) -> {
            System.out.println(dayOfWeek.getDisplayName(TextStyle.FULL_STANDALONE, Locale.getDefault()) + ": "
                    + duration.toHours() + " hours (" + duration.toMinutes() + " minutes)");
        });
    }

    private static DayOfWeek parseDayOfWeek(String weekday) {
        switch (weekday.toLowerCase()) {
        case "mon":
            return DayOfWeek.MONDAY;
        case "tue":
            return DayOfWeek.TUESDAY;
        case "wed":
            return DayOfWeek.WEDNESDAY;
        case "thu":
            return DayOfWeek.THURSDAY;
        case "fri":
            return DayOfWeek.FRIDAY;
        case "sat":
            return DayOfWeek.SATURDAY;
        case "sun":
            return DayOfWeek.SUNDAY;
        default:
            throw new RuntimeException("Unparsable weekday: \"" + weekday + "\"");
        }
    }

    private static Map<DayOfWeek, Duration> findMaxDurationsFrom(Map<DayOfWeek, Duration> weekDurations) {
        final Map<DayOfWeek, Duration> maxDurations = new TreeMap<>();
        // find the maximum duration as a reference for all equal durations
        Duration maxDuration = findMaxDuration(weekDurations);
        // go through all durations and store those equal to maxDuration (no matter what day of week)
        weekDurations.forEach((DayOfWeek dayOfWeek, Duration duration) -> {
            if (duration.equals(maxDuration)) {
                maxDurations.put(dayOfWeek, duration);
            }
        });

        return maxDurations;
    }

    private static <K, V extends Comparable<V>> V findMaxDuration(Map<K, V> map) {
        Entry<K, V> maxEntry = Collections.max(map.entrySet(),
                (Entry<K, V> e1, Entry<K, V> e2) -> e1.getValue().compareTo(e2.getValue()));
        return maxEntry.getValue();
    }
}

Надеюсь, это поможет ...

...