Java arraylist методы сортировки

Java ArrayList sort()

The sort() method sorts the elements in an arraylist according to the specified order.

Example

import java.util.ArrayList; import java.util.Comparator; class Main < public static void main(String[] args) < // create an ArrayList ArrayListnumbers = new ArrayList<>(); numbers.add(7); numbers.add(3); numbers.add(9); numbers.add(-33); System.out.println("Unsorted ArrayList: " + numbers); // sort the ArrayList in ascending order 
numbers.sort(Comparator.naturalOrder());
System.out.println("Sorted ArrayList: " + numbers); > > // Output: Unsorted ArrayList: [7, 3, 9, -33] // Sorted ArrayList: [-33, 3, 7, 9]

Syntax of ArrayList sort()

The syntax of the sort() method is:

arraylist.sort(Comparator c)

Here, arraylist is an object of the ArrayList class.

sort() Parameters

The sort() method takes a single parameter.

sort() Return Values

The sort() method does not return any value. Rather it only changes the order of elements in an arraylist.

Example 1: Sort the ArrayList in Natural Order

import java.util.ArrayList; import java.util.Comparator; class Main < public static void main(String[] args) < // create an ArrayList ArrayListlanguages = new ArrayList<>(); // add elements to ArrayList languages.add("Python"); languages.add("Swift"); languages.add("C"); languages.add("JavaScript"); System.out.println("Unsorted ArrayList: " + languages); // sort the ArrayList in ascending order 
languages.sort(Comparator.naturalOrder());
System.out.println("Sorted ArrayList: " + languages); > >
Unsorted ArrayList: [Python, Swift, C, JavaScript] Sorted ArrayList: [C, JavaScript, Python, Swift]

In the above example, we have used the sort() method to sort the arraylist named languages. Notice the line,

languages.sort(Comparator.naturalOrder());

Here, the naturalOrder() method of the Java Comparator Interface specifies that elements are sorted in natural order (i.e. ascending order).

Читайте также:  Javascript определить тип строки

The Comparator interface also provides a method to sort elements in descending order. For example,

Example 2: Sort the ArrayList in Reverse Order

import java.util.ArrayList; import java.util.Comparator; class Main < public static void main(String[] args) < // create an ArrayList ArrayListlanguages = new ArrayList<>(); // add elements to ArrayList languages.add("Python"); languages.add("Swift"); languages.add("C"); languages.add("JavaScript"); System.out.println("Unsorted ArrayList: " + languages); // sort the ArrayList in ascending order 
languages.sort(Comparator.reverseOrder());
System.out.println("Sorted ArrayList: " + languages); > >
Unsorted ArrayList: [Python, Swift, C, JavaScript] Sorted ArrayList: [Swift, Python, JavaScript, C]

Here, the reverseOrder() method of the Comparator interface specifies that elements are sorted in reverse order (i.e. descending order).

Note: The Collections.sort() method is the more convenient method for sorting an arraylist.

Источник

Сортировка списков в Java

Для возможности сортировки объектов в коллекциях наследниках List в Java существует статический метод класса java.util.Collections .

Это значит вы можете сортировать элементы таких классов как ArrayList, LinkedList, CopyOnWriteArrayList и других классов, имплементирующих интерфейс List .

В общем виде, если у вас есть список из строк:

то после сортировки получите в списке порядок:

Простое использование метода sort() #

Если у нас в списке находятся объекты классов, которые известно как сравнить, то достаточно просто вызвать метод sort() и передать туда список. Таким образом в списке элементы поменяют порядок и будут отсортированы в порядке возрастания

//создание списка на основе массива  var stringList = Arrays.asList("z", "b", "c", "a", "k", "z"); System.out.println(stringList);  //сортировка списка в порядке возрастания  Collections.sort(stringList);  System.out.println(stringList); 

Так мы можем сортировать множество стандартных классов, таких как String, Integer, Double, Character и множество других.

Если более точно выразиться, то без дополнительных параметров возможно отсортировать список из любых элементов, классы которых имплементируют интерфейс сравнения Comparable .

Сортировка в обратном порядке #

Если мы хотим сортировать элементы в обратном порядке. То для этого передадим дополнительный аргумент в метод сортировки:

//создание списка на основе массива  var stringList = Arrays.asList("z", "b", "c", "a", "k", "z"); System.out.println(stringList);  //сортировка списка в обратном направлении  Collections.sort(stringList, Collections.reverseOrder());  System.out.println(stringList); 

Добавляем возможность сортировки своих классов #

Если стандартные классы уже готовы к сортировке, то если мы напишем свой класс, то Java не знает как есть сравнивать с объектами этого же класса.

Чтобы научить сравнивать объекты есть два варианта:

  • создать класс на основе Comparator и там прописать правила сравнения в методе int compare(T o1, T o2) . Полученный объект из класса использовать всегда, когда нам надо сортировать объекты. Такой вариант отлично подходит, когда нам надо сортировать объекты по разным правилам и можем использовать нужный нам класс Comparator.
  • добавить в класс (являющимся, элементом списка) имплементацию интерфейса Comparable и прописать правила сравнения в методе int compareTo(T o) . Тогда не потребуется указывать каждый раз компаратор, данное правило сравнение будет по-умолчанию для этого объекта.

Оба метода возвращают целое число, которое обычно интерпретируется так:

  • число больше 0 -> объект с которым сравнивают больше текущего
  • число равно 0 -> объекты одинаковые
  • число меньше 0 -> объект с которым сравнивают меньше текущего

Создадим свой класс, например для студента:

class Student   private final String name;  private final double avgMark;   public Student(String name, double avgMark)   this.name = name;  this.avgMark = avgMark;  >   @Override  public String toString()   return " + name + '\'' + ", m=" + avgMark + '>';  > > 

Класс специально минимально простой: все параметры задаются в конструкторе, и используются значения только для печати данных при вызове toString, что поможет нам в визуализации результата.

Для начала, посмотрим, что будет если мы попробуем отсортировать список из студентов:

var ivan = new Student("Иван", 4.3); var olga = new Student("Ольга", 3.8); var eugene = new Student("Женя", 4.9); var studentList = Arrays.asList(ivan, olga, eugene);  System.out.println(studentList); //сортировка списка  Collections.sort(studentList); System.out.println(studentList); 

Такой код не скомпилируется, так как метод sort() не просто ожидает список, но еще важно, чтобы элемент списка был наследником Comparable:

public static T extends Comparable super T>> void sort(ListT> list)   list.sort(null); > 

Использование Comparable #

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

Имплементируем Comparable интерфейс, и реализуем метод compareTo:

class Student implements ComparableStudent>   private final String name;  private final double avgMark;   public Student(String name, double avgMark)   this.name = name;  this.avgMark = avgMark;  >   @Override  public String toString()   return " + name + '\'' + ", m=" + avgMark + '>';  >   @Override  public int compareTo(Student o)   return name.compareTo(o.name);  > > 

Обратите внимание, внутри метод мы решили сравнить две строки, а так как у String есть реализация Comparable — мы можем ее использовать.

В данном коде опущены части, с проверкой на null объектов o и полей класса.

Давайте проверим, как это будет работать:

var ivan = new Student("Иван", 4.3); var olga = new Student("Ольга", 3.8); var eugene = new Student("Женя", 4.9);  var studentList = Arrays.asList(ivan, olga, eugene); System.out.println(studentList); //сортировка списка  Collections.sort(studentList); System.out.println(studentList); 

Все отлично, список отсортирован по полю name .

Вы можете делать более сложные условия сравнения, только не забывайте учитывать требование для успешной сортировки — два объекта, сколько бы мы их не сравнивали — должны всегда давать одинаковый результат.

Использование Comparator #

А что если нам надо сортировать студентов не по имени, а по средней оценке? И при этом оставить возможность сортировать по имени, которое должна использоваться по умолчанию для создания различных документов.

Нам на помощь придет отдельный класс Comparator , которые хранит в себе логику сравнения объектов и при сортировке, мы можем использовать нужное правило, то есть нужный объект класса Comparator .

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

class Student implements ComparableStudent>   private final String name;  private final double avgMark;   public Student(String name, double avgMark)   this.name = name;  this.avgMark = avgMark;  >   @Override  public String toString()   return " + name + '\'' + ", m=" + avgMark + '>';  >   @Override  public int compareTo(Student o)   return name.compareTo(o.name);  >   public String getName()   return name;  >   public double getAvgMark()   return avgMark;  > > 

и теперь создадим класс Comparator , тип для сравнения Student :

class ComparatorByAvgMark implements ComparatorStudent>   @Override  public int compare(Student o1, Student o2)   return Double.compare(o1.getAvgMark(), o2.getAvgMark());  > > 

Мы снова использовали готовый метод для сравнения стандартного класса Double , это помогает не выдумывать свои реализации, а использовать уже существующие.

Также снова опущены проверки на null объектов o1, o2.

Теперь можно использовать данный класс, и в этот раз нам пригодится перегруженный метод Collections.sort() , который принимает компаратор:

var ivan = new Student("Иван", 4.3); var olga = new Student("Ольга", 3.8); var eugene = new Student("Женя", 4.9);  var studentList = Arrays.asList(ivan, olga, eugene); System.out.println(studentList);  //сортировка списка c использованием компаратора  Collections.sort(studentList, new ComparatorByAvgMark());  System.out.println(studentList); 

И мы видим — сортировка по возрастанию средней оценки студента.

Хорошо, давайте сделаем обратную сортировку, высокие оценки должны быть в начале списка. Для этого нам потребуется изменить поведение компаратора, и для этого у компаратора есть метод reversed() :

Collections.sort(studentList, new ComparatorByAvgMark().reversed()); 

и в итоге получим нужный результат:

Но это еще не все что может компаратор, можно создавать цепочки. Например, сначала сортируем по оценкам, а если оценки одинаковые, то по имени.

Это можно реализовать не создавая отдельного класса, а воспользоваться функцией:

Collections.sort(studentList,  new ComparatorByAvgMark().reversed()  .thenComparing(Student::getName)); 

При такой сортировки, оценки будут в порядке убывания, а внутри одной средней оценки, студенты будут по имени в порядке возрастания.

Метод sort() у самого списка #

Кроме использования метода Collections.sort() , можно вызывать похожий метод у самого списка List.sort() . Метод принимает один аргумент — компаратор.

На примере списка студентов:

studentList.sort(new ComparatorByAvgMark()); 

Источник

Сортировка Arraylist java

В этой статье мы поделимся примерами сортировки String ArrayList и Integer ArrayList.

Пример 1: сортировка ArrayList

Здесь мы сортируем ArrayList типа String. Делать это можно, просто используя метод Collections.sort (arraylist). Список вывода будет отсортирован по алфавиту.

import java.util.*; public class Details < public static void main(String args[])< ArrayList listofcountries = new ArrayList(); listofcountries.add("India"); listofcountries.add("US"); listofcountries.add("China"); listofcountries.add("Denmark"); /*Unsorted List*/ System.out.println("До:"); for(String counter: listofcountries)< System.out.println(counter); >/* Sort statement*/ Collections.sort(listofcountries); /* Sorted List*/ System.out.println("После:"); for(String counter: listofcountries) < System.out.println(counter); >> >
До: India US China Denmark После: China Denmark India US

Пример 2

Тот же метод Collections.sort() можно использовать и для сортировки целочисленного массива Java.

import java.util.*; public class ArrayListOfInteger < public static void main(String args[])< ArrayList arraylist = new ArrayList(); arraylist.add(11); arraylist.add(2); arraylist.add(7); arraylist.add(3); /* ArrayList before the sorting*/ System.out.println("Before Sorting:"); for(int counter: arraylist)< System.out.println(counter); >/* Sorting of arraylist using Collections.sort*/ Collections.sort(arraylist); /* ArrayList after sorting*/ System.out.println("After Sorting:"); for(int counter: arraylist) < System.out.println(counter); >> >
Before Sorting: 11 2 7 3 After Sorting: 2 3 7 11

Сортировка по убыванию

Мы используем метод Collections.reverseOrder() вместе с Collections.sort() для сортировки списка в порядке убывания. В приведенном ниже примере мы использовали инструкцию для сортировки в обратном порядке: Collections.sort (arraylist, Collections.reverseOrder ()).

Однако это также можно выполнить следующим образом. Тогда список будет сначала отсортирован в порядке возрастания, а затем будет перевернут:

import java.util.*; public class Details < public static void main(String args[])< ArrayListarraylist = new ArrayList(); arraylist.add("AA"); arraylist.add("ZZ"); arraylist.add("CC"); arraylist.add("FF"); /*Unsorted List: ArrayList content before sorting*/ System.out.println("Before Sorting:"); for(String str: arraylist) < System.out.println(str); >/* Sorting in decreasing order*/ Collections.sort(arraylist, Collections.reverseOrder()); /* Sorted List in reverse order*/ System.out.println("ArrayList in descending order:"); for(String str: arraylist) < System.out.println(str); >> >
Before Sorting: AA ZZ CC FF ArrayList in descending order: ZZ FF CC AA

В приведенном выше примере мы использовали ArrayList типа String (ArrayList ). Этот же метод можно применять и для списка целых чисел.

Средняя оценка 4.4 / 5. Количество голосов: 41

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Видим, что вы не нашли ответ на свой вопрос.

Напишите комментарий, что можно добавить к статье, какой информации не хватает.

Источник

Оцените статью