Как я могу изменить список дат, чтобы включить ведущий ноль (0) - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь отсортировать список дат в порядке возрастания или убывания. Однако даты у меня в формате 1/12/2020 вместо 01/12/2020. Как я могу изменить этот список, чтобы даты были в правильном формате? Я включил пример дат у меня ниже:

Actual -    1/12/2020, 1/5/2020, 12/29/2019, 12/22/2019, 12/15/2019
Expected - 01/12/2020, 01/05/2020, 12/29/2019, 12/22/2019, 12/15/2019

Мой текущий код:

public static void assertSortedDates(Grid grid, String header, String format, boolean isAscending) throws Exception {
List<String> original = new ArrayList<String>();
original = grid.getColumn(header);
// if cannot find header try second row of headers
if (original == null) {
    original = grid.getColumnSubtext(header);
}
Collections.replaceAll(original, null, "1 Jan 1901");
Collections.replaceAll(original, "", "1 Jan 1901");
List<String> sorted = DateHelper.sortDates(original, format, isAscending);
assertEquals("Cell Date column is not sorted: " + header + " expected: \n" + sorted + "\nbut got:\n" + original, sorted, original);
}

Код sortDates ниже:

public static List<String> sortDates(List<String> dates, String format, boolean isAscending) throws ParseException{
    List<String> sortedDates = new ArrayList<>();
    SimpleDateFormat sdf = new java.text.SimpleDateFormat(format);

    // convert to date
    Date[] arrayOfDates = new Date[dates.size()];

    for (int i = 0; i < dates.size(); i++) {
        arrayOfDates[i] = sdf.parse(dates.get(i));
    }

    // sort
    if (isAscending) {
        Arrays.sort(arrayOfDates);
    } else {
        Arrays.sort(arrayOfDates, Collections.reverseOrder());
    }

    // convert back to String
    for (int index = 0; index < arrayOfDates.length; index++) {
        sortedDates.add(sdf.format(arrayOfDates[index]));
    }
    return sortedDates;
}

РЕДАКТИРОВАТЬ: я уже установил формат даты ММ / дд / гггг в моем методе sortOnCallSummary, который вызывает метод assertSortedDates. Я предполагаю, что мне нужно также где-то отформатировать исходный список, но я не уверен, где это сделать.

private void sortOnCallSummary() throws Exception {
    Grid grid;
    String[] headersAllJobs = { "From", "To", "RHVAC Technician Schedules Complete", "MST Schedules Complete" };
    for (String header : headersAllJobs) {
        scrollTo(0);
        runtimeState.onCallSummaryPage.tableSort(header, RandomUtils.nextBoolean());
        boolean isAscending = runtimeState.onCallSummaryPage.isAscending(header);
        outputHelper.takeScreenshot();
        grid = runtimeState.onCallSummaryPage.getGrid();
        String order = isAscending ? "ascending" : "descending";
        runtimeState.scenario.write("Asserting " + header + " column is sorted in " + order + " order");

        switch (header) {
        case "From":
        case "To":
            GridHelper.assertSortedDates(grid, header, "MM/dd/yyyy", isAscending);
            break;
        case "RHVAC Technician Schedules Complete":
        case "MST Schedules Complete":
        default:
            GridHelper.assertSortedAlphabetic(grid, header, isAscending);
            break;
        }
    }
}

1 Ответ

0 голосов
/ 16 января 2019

Вы должны использовать последний java.time API, тогда вам просто нужно будет проанализировать как LocalDate и использовать встроенную сортировку:

  • Назовите это как: sortDates(datesStr, "M/d/yyyy", true);
static List<LocalDate> sortDates(List<String> datesStr, String format, boolean isAscending) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
    List<LocalDate> dates = new ArrayList<>();
    for (String str : datesStr) {
        LocalDate date = LocalDate.parse(str, formatter);
        dates.add(date);
    }
    dates.sort(isAscending ? Comparator.naturalOrder() : Comparator.reverseOrder());
    return dates;
}

По-потоковому это будет выглядеть

static List<LocalDate> sortDates(List<String> datesStr, String format, boolean isAscending) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
    return datesStr.stream()
                   .map(str -> LocalDate.parse(str, formatter))
                   .sorted(isAscending ? Comparator.naturalOrder() : Comparator.reverseOrder())
                   .collect(Collectors.toList());
}
...