Сортировка списка строкового массива по 3-му элементу - PullRequest
3 голосов
/ 16 июня 2020

Я пытаюсь отсортировать список массивов String по его 3-му элементу. Третий элемент - это значение даты. Я уже несколько часов пытаюсь решить эту проблему, поменяв местами, но все еще не могу решить эту проблему. Для моего текущего List я не верю, что Arrays.sort() было бы идеальным, поэтому я сортирую это через l oop.

List<String[]> Record = new ArrayList<>();
Record.add(new String[] { "0001047166", "11047161", "20191223", "20200916" });
Record.add(new String[] { "0001047166", "11047162", "20191223", "20200916" });
Record.add(new String[] { "0001047166", "11047163", "20191222", "20200916" });
Record.add(new String[] { "0001047166", "11047166", "20191218", "20200916" });
Record.add(new String[] { "0001047359", "11047359", "20191217", "20200917" });

int size = Record.size();
int swapIndex = 0;
for (int i = 0; i < size-1; i++) {
    String[] currentArray = Record.get(i); //get array on current index
    String date = currentArray[2]; //get the date on 3rd position, index 2 of current array
    swapIndex = i;
    for (int j = i + 1; j < Record.size(); j++) {
    String[] nextArray = Record.get(j);  //get the next array (i + 1)
        String otherDate = nextArray[2]; //get the date on 3rd position, index 2 of next arrray
        if (date.compareTo(otherDate) > 0) {
            String[] currArray = currentArray; //save the current array to temp
        //swap 
            Record.set(swapIndex, nextArray); 
            Record.set(j, currArray);
            swapIndex++;
        }
    }           
}

//Display result
for (String[] a : Record) {
    System.out.println(a[2]);
}

Я получаю

20191222 (wrong)
20191217
20191218
20191223
20191223

Желаемый результат:

20191217
20191218
20191222
20191223
20191223

Буду признателен за любые идеи или предложения.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 16 июня 2020
Здесь будет работать

Collections.sort (или List.sort):

Collections.sort(Record, Comparator.comparing(array -> array[2]));
Record.sort(Comparator.comparing(array -> array[2]));

И если ваш Java старше 8, вы все равно можете использовать Collections.sort:

Collections.sort(Record, new Comparator<String[]>() {
    @Override
    public int compare(String[] o1, String[] o2) {
        return o1[2].compareTo(o2[2]);
    }
});

Вам не нужно анализировать объект Date перед сравнением, потому что формат yyyyMMdd позволяет согласовывать сравнение строк с датами.

4 голосов
/ 16 июня 2020

Вы можете сортировать, используя лямбда с настраиваемым компаратором, который использует третью (строковую) дату:

Record.sort((String[] sa1, String[] sa2) -> sa1[2].compareTo(sa2[2]));
Record.stream().forEach(sa -> System.out.println(sa[2]));

Это печатает:

20191217
20191218
20191222
20191223
20191223

Обратите внимание, что в идеале вы должны сравнивать какие-то настоящие типы дат, а не строки даты. При этом, учитывая, что ваши строки даты выглядят в формате ISO, сортировка по тексту должна работать. Кроме того, соглашение об именах Java гласит, что имена переменных не должны начинаться с заглавных букв. Итак, в идеале ваш список должен называться record, а не Record.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...