По соглашению, при использовании Java-программирования вы должны максимально использовать существующие библиотеки классов. Конечно, вы также можете написать метод сортировки или фреймворк самостоятельно, но много ли людей смогут написать лучше, чем те, что в JDK? Еще одним преимуществом использования существующих классов является то, что код легко читать и поддерживать. В этой статье в основном рассказывается о том, как использовать существующие библиотеки классов для сортировки массивов и различных контейнеров коллекций (некоторые примеры в статье взяты из «Альманаха разработчиков Java 1.4»). )
Прежде всего, вам необходимо знать два класса: java.util.Arrays и java.util.Collections (обратите внимание на разницу с Collection). Collection — это интерфейс верхнего уровня структуры коллекций, а Collections содержит множество статических методов. Мы используем массивы для сортировки массивов и коллекции для сортировки комбинированных контейнеров фреймов, таких как ArraysList, LinkedList и т. д.
В примеры необходимо добавить импорт java.util.* и другие шелл-коды, такие как классы и статические основные методы. Я напишу все коды в первом примере и буду опускать их без исключения.
Сортировать массив
Например, есть массив целых чисел:
Скопируйте код кода следующим образом:
int[] intArray = новый int[] {4, 1, 3, -23};
Как мы это сортируем? Вы сейчас думаете об алгоритме быстрой сортировки? Посмотрите, как это делается:
Скопируйте код кода следующим образом:
импортировать java.util.*;
общественный класс Сортировка {
public static void main(String[] args){
int[] intArray = новый int[] {4, 1, 3, -23};
Массивы.сорт(intArray);
}
}
Таким образом, мы используем статический метод sort() класса Arrays для сортировки intArray в порядке возрастания, и теперь массив стал {-23,1,3,4}.
Если это массив символов:
Скопируйте код кода следующим образом:
String[] strArray = новая String[] {"z", "a", "C"};
Мы используем:
Скопируйте код кода следующим образом:
Массивы.сорт(strArray);
Результатом после сортировки будет {C, a, z}, и функция sort() будет сортировать по возрастанию в соответствии с естественным порядком элементов. Если вы хотите быть нечувствительным к регистру, вы можете написать:
Скопируйте код кода следующим образом:
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
Конечно, мы также можем указать определенную часть массива для сортировки. Например, если мы хотим отсортировать части массива 0–2 (при условии, что длина массива больше 3), а остальные части останутся неизменными, мы можно использовать:
Скопируйте код кода следующим образом:
Arrays.sort(strArray,0,2);
Таким образом, мы сортируем только первые три элемента, не затрагивая последующие части.
Конечно, некоторые подумают: а как мне отсортировать по убыванию? Среди множества методов сортировки один экземпляр кода выглядит следующим образом:
sort(T[] a, Comparator<? super T> c)
Мы можем использовать Comparator для получения компаратора в обратном порядке. В качестве примера рассмотрим предыдущий intArray[]:
Скопируйте код кода следующим образом:
Arrays.sort(intArray,Comparator.reverseOrder());
Таким образом, мы получаем результат {4,3,1,-23}. Если мы не хотим изменять исходный код, мы также можем использовать:
Скопируйте код кода следующим образом:
Collections.reverse(Arrays.asList(intArray));
Получите обратный порядок массива. Результат также 4,3,1,-23}.
Теперь ситуация изменилась. Наш массив больше не является массивом примитивного типа данных (примитивного типа) или типа String, а является массивом объектов. Естественный порядок этого массива неизвестен, поэтому нам нужно реализовать интерфейс Comparable для этого класса. Например, у нас есть класс Name:
Скопируйте код кода следующим образом:
Имя класса реализует Comparable<Name>{
общедоступная строка firstName,lastName;
публичное имя (строка firstName, строка LastName) {
this.firstName=firstName;
this.lastName=lastName;
}
public int CompareTo(Name o) { //Реализуем интерфейс
intlastCmp=lastName.compareTo(o.lastName);
return (lastCmp!=0?lastCmp:firstName.compareTo(o.firstName));
}
public String toString(){ //Удобно для тестирования вывода
вернуть имя+" "+фамилия;
}
}
Таким образом, когда мы сортируем этот массив объектов, мы сначала сравниваем LastName, затем сравниваем FirstName, а затем получаем порядок двух объектов, точно так же, как это реализовано в CompareTo(Name o). Вы также можете попробовать это с помощью программы:
Скопируйте код кода следующим образом:
импортировать java.util.*;
общественный класс NameSort {
public static void main(String[] args) {
Имя nameArray[] = {
новое имя("Джон", "Леннон"),
новое Имя("Карл", "Маркс"),
новое имя("Граучо", "Маркс"),
новое имя («Оскар», «Ворчун»)
};
Arrays.sort(nameArray);
for(int i=0;i<nameArray.length;i++){
System.out.println(nameArray[i].toString());
}
}
}
Результат такой, как мы ожидали:
Скопируйте код кода следующим образом:
Оскар Грауч
Джон Леннон
Граучо Маркс
Карл Маркс
Сортировка рамок коллекции
Если вы поняли, как Arrays.sort() сортирует массивы, использование структуры сбора аналогично. Просто замените массивы на коллекции. Обратите внимание, что коллекции — это класс, а коллекция — это интерфейс. Хотя разница только в одной букве «s», их значения совершенно разные.
Предположим, есть такой связанный список:
Скопируйте код кода следующим образом:
Список LinkedList = новый LinkedList ();
список.добавить(4);
список.добавить(34);
список.добавить(22);
список.добавить(2);
Нам просто нужно использовать:
Скопируйте код кода следующим образом:
Коллекции.сортировать(список);
Вы можете отсортировать элементы в ll от меньшего к большему, и результат будет следующим:
Скопируйте код кода следующим образом:
[2, 4, 22, 34]
Если элементы в LinkedList являются строками, они также будут отсортированы от меньшего к большему, как и базовые типы данных.
Если вы хотите реализовать обратную сортировку, то есть от доходящей до мелкой сортировки:
Скопируйте код кода следующим образом:
Collections.sort(list,Collectons.reverseOrder());
Если элементы в LinkedList являются пользовательскими объектами, вы можете реализовать интерфейс Comparable, например, объект Name выше, а затем позволить Collection.sort() отсортировать их за вас.
Если вы хотите отсортировать объект по своему усмотрению, вы можете использовать скопированный код следующим образом:
сортировка (список List<T>, Comparator<? super T> c)
Этот метод выполняет сортировку. Прежде чем приводить пример, мы должны сначала объяснить использование Comparator и формат интерфейса Comparable:
Скопируйте код кода следующим образом:
общедоступный интерфейс Comparator<T> {
int Compare(T o1, T o2);
}
Фактически, метод записи int Compare(T o1,T o2) в Comparator аналогичен методу записи метода CompareTo() в Comparable. В приведенном выше классе Name наше сравнение начинается с LastName. Это привычка жителей Запада. В Китае мы хотим начинать сравнение с fristName, не изменяя исходный код. В этот раз нам может пригодиться Comparator:
Скопируйте код кода следующим образом:
окончательный Comparator<Name> FIRST_NAME_ORDER=новый Comparator<Name>() {
public int Compare (Имя n1, Имя n2) {
int firstCmp=n1.firstName.compareTo(n2.firstName);
return (firstCmp!=0?firstCmp:n1.lastName.compareTo
(n2.firstName));
}
};
Таким образом написан наш настроенный компаратор FIRST_NAME_ORDER.
Преобразуйте массив имен из предыдущего примера в список:
Скопируйте код кода следующим образом:
List<Name> list=Arrays.asList(nameArray);
Collections.sort(список,FIRST_NAME_ORDER);
Таким образом, мы успешно установили сортировку, используя наш собственный компаратор.