Java Collections.sort для подстановочного списка (Список ) - PullRequest
1 голос
/ 15 апреля 2020

Поэтому я пытаюсь создать общую служебную функцию для сортировки списков различных типов (в основном встроенных оболочек и строк). Пример кода приведен ниже:

public void sortArrays(List<?>... arr) {
    // do here
}

И его можно использовать следующим образом:

List<Integer> a = // initialization
List<String> b = // initialization
...

sortArrays(a, b)

Функция будет сортировать список varargs, и я планирую использовать Collections.sort (.. .) но, к сожалению, он не работает в списке захвата Есть ли правильное решение или подход к тому, чего я пытаюсь достичь?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Документация Collections#sort гласит, что она принимает List<T> в качестве параметра, где T определяется как:

<T extends Comparable<? super T>>

Следовательно, вы должны иметь возможность чтобы определить аналогичный тип generi c в вашем методе sortArrays:

public <T extends Comparable<? super T>> void sortArrays(List<T>... arr) {
    for (List<T> list : arr) {
        Collections.sort(list);
    }
}

Это решение будет работать, если ваша цель - передать списки одного типа. Для передачи списков различных типов см. Ниже.


Существует решение hacky , которое использует raw types , позволяющее передавать списки различных типов в Ваш sortArrays метод:

public static void main(String[] args) {
    List<Integer> integerList = new ArrayList<>(List.of(3, 2, 1));
    List<String> stringList = new ArrayList<>(List.of("6", "5", "4"));

    sortArrays(integerList, stringList);

    System.out.println(integerList);
    System.out.println(stringList);
}

public static void sortArrays(List<? extends Comparable>... arr) {
    for (List<? extends Comparable> list : arr) {
        Collections.sort(list);
    }
}

Вывод приведенного выше фрагмента:

[1, 2, 3]
[4, 5, 6]
1 голос
/ 15 апреля 2020

Предполагая, что вы хотите, чтобы каждый список был отсортирован независимо по их естественному порядку , вы можете сделать это, используя raw generics, однако это не рекомендуется.

@SafeVarargs
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void sortArrays(List<? extends Comparable>... lists) {
    for (List<? extends Comparable> list : lists)
        Collections.sort(list);
}
List<Integer> a = Arrays.asList();
List<String> b = Arrays.asList();
List<Object> c = Arrays.asList();
sortArrays(a, b);
sortArrays(c); // compilation error because Object is not a Comparable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...