Сортировка по двум параметрам java лямбда

Добавил пользователь Владимир З.
Обновлено: 20.09.2024

Could somebody show me a quick example how to sort an ArrayList alphabetically in Java 8 using the new lambda syntax.

11 Answers 11

For strings this would work

Note that both .sort(String::compareTo) and .sort(Comparator.naturalOrder()) will sort all upper case letters before any lower case letters. Usually what you want is .sort(String::compareToIgnoreCase)

Are you just sorting String s? If so, you don't need lambdas; there's no point. You just do

. though if you're sorting objects with a String field, then it makes somewhat more sense:

Using list.sort(String::compareTo) or list.sort(Comparator.naturalOrder()) will give incorrect (ie. non-alphabetical) results. It will sort any upper case letter before all lower case letters, so the array ["aAAA","Zzz", "zzz"] gets sorted to ["Zzz", "aAAA", "zzz"]

Suppose you have List of names(String) which you want to sort alphabetically.

its working perfectly.

In functional programming, you're not using the old objects to operate on them, but creating the new one in such a fashion:

This is incorrect, as now the stream no longer consists of the old elements, but of the mapped and filtered version. Consider a bank account which you want to sort by person name: If you do it like you suggest, then you start of with a stream of bank accounts, and end up with a stream of person names, while you want to end up with a stream of bank accounts again.

Generally, when you write your programs in FP-style, you don't need to iterately save the results. So, this all is a new list(s): list.stream().sorted() is not sorting the old list, but creating the new one.

And that list has just became useless as you only have the person's name left (in my example), and you cannot reference it back (directly) to their bank account anymore.

Also, possibly a source of your confusion (nothing to blame), is that the OP requested a method to sort a list, yet you only return an intermediary stream, you also will need to store it at some point, which you omitted from your answer. By trying to implement that, you may see the issue yourself aswell.

@skiwi there's no need to specify the sort operator as OP wanted to sort String s in lexicographic order, it's the default behavior.

У меня есть массив объектов person (int age; String name;) .

Как я могу отсортировать этот массив по алфавиту, а затем по возрасту?

какой алгоритм вы бы использовали для этого ?

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

List теперь сортируется по имени, затем по возрасту.

String.compareTo "сравнивает две строки лексикографически" - с docs.

Collections.sort статический метод в собственной библиотеке коллекций. Он выполняет фактическую сортировку, вам просто нужно предоставить компаратор, который определяет, как должны сравниваться два элемента в вашем списке: это достигается путем предоставления вашей собственной реализации compare метод.

для тех, кто может использовать Java 8 streaming API, есть более аккуратный подход, который хорошо документирован здесь: лямбда и сортировка

Я нашел механизм в Java 8 на компаратор:

Итак, вот фрагмент, который демонстрирует алгоритм.

Проверьте ссылку выше для более аккуратного способа и объяснения того, как вывод типа Java делает его немного более неуклюжим для определения по сравнению с LINQ.

вот полный модульный тест для справки:

использование подхода Java 8 Streams.

и подход Java 8 Lambda.

вам нужно реализовать свой собственный Comparator , а затем использовать его, например:

ваш компаратор может выглядеть примерно так:

компаратор сначала сравнивает имена,если они не равны, он возвращает результат от сравнения их, иначе он возвращает результат сравнения при сравнении возрастов обоих лиц.

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

у вашего класса person implement Comparable а затем реализовать метод compareTo, например:

это будет сортировать сначала по имени (без учета регистра), а затем по возрасту. Затем вы можете запустить Arrays.sort() или Collections.sort() на коллекции или массиве объектов Person.

использовать Comparator а затем поместите объекты в Collection , потом Collections.sort();

гуава это ComparisonChain обеспечивает чистый способ сделать это. Обратитесь к этому ссылке.

утилита для выполнения оператора цепного сравнения. Например:

вы можете сделать так:

или вы можете использовать тот факт, что Collections.sort() (или Arrays.sort() ) стабилен (он не переупорядочивает элементы, которые равны) и использует Comparator сначала сортировать по возрасту, а затем еще один для сортировки по имени.

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

можно использовать универсальный последовательный компаратор для сортировки коллекций по нескольким полям.

создайте столько компараторов, сколько необходимо. После этого вызовите метод "thenComparing" для каждой категории заказа. Это способ делать потоками. См.:

было бы лучше написать так:

на Comparator ' s compare() метод должен возвратить int , и похоже, ваш возвращается long .

вы можете изменить его на:

лямда -

лямбда можно рассматривать как стенографию несколько громоздкого анонимного класса:

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

приложение

в вашей конкретной проблеме, вы можете увидеть compare возвращает int , где getTime возвращает long, который является источником ошибки.

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

обратите внимание

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

компаратор

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

для заказа требуется два аргумента. Возвращает

Анонимные Классы как сортировать список объектов в предыдущие версии Java 8 использование внутренних классов.

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

Java 8 Lambda Expressions uing сравнить способ

лямбда-выражение похоже на метод: оно предоставляет список формальных параметров и тело - выражение или блок - выраженное в терминах этих параметров.

лямбда-выражение: LambdaParameters -> LambdaBody

любая локальная переменная, формальный параметр или параметр исключения, используемый, но не объявленный в лямбда-выражении, должен быть объявлен final или быть фактически final, или ошибка времени компиляции возникает при попытке использования.

базовая сортировка с поддержкой лямбда

используя полученный ключ и сравнение метода: компаратор это сравнивается извлеченным ключом. Передайте ссылки, используя:: ключевое слово.

Элегантная сортировка в Java 8 – Лямбда-выражения проходят мимо синтаксического сахара и привносят в Java мощную функциональную семантику.

1. Обзор

В этом уроке мы сначала рассмотрим поддержку Lambda в Java 8 – в частности, как использовать ее для написания Компаратора и сортировки коллекции .

Эта статья является частью серии “Java – Back to Basic” здесь, на Baeldung.

Дальнейшее чтение:

Учебник по потоковому API Java 8

Руководство по сборщикам Java 8

Лямбда-выражения и функциональные интерфейсы: Советы и рекомендации

Во-первых, давайте определим простой класс сущностей:

2. Базовая Сортировка Без Лямбд

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

Это будет просто использоваться для сортировки Списка сущностей Человека :

3. Базовая Сортировка С Поддержкой Лямбды

С введением лямбд мы теперь можем обойти анонимный внутренний класс и достичь того же результата с помощью простой функциональной семантики :

Аналогично – теперь мы можем проверить поведение так же, как и раньше:

Обратите внимание, что мы также используем новый sort API, добавленный в java.util.Список в Java 8 – вместо старых коллекций.сортировка API.

4. Базовая Сортировка Без Определений Типов

Мы можем еще больше упростить выражение, не указывая определения типов – компилятор способен вывести их самостоятельно:

И опять же, тест остается очень похожим:

5. Сортировка С использованием ссылки на Статический метод

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

Во – первых, мы определим метод compareByNameThenAge – с той же сигнатурой, что и метод compare в объекте Comparator :

Теперь мы собираемся вызвать метод humans.sort с этой ссылкой:

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

6. Сортировка Извлеченных Компараторов

Мы собираемся использовать getter getName() для построения лямбда-выражения и сортировки списка по имени:

7. Обратная Сортировка

JDK 8 также представил вспомогательный метод для реверсирования компаратора – мы можем быстро использовать его для реверсирования нашей сортировки:

8. Сортировка С Несколькими Условиями

Сравнение лямбда – выражений не обязательно должно быть таким простым – мы можем написать более сложные выражения, а также – например, сортировка сущностей сначала по имени, а затем по возрасту:

9. Сортировка С Несколькими Условиями – Состав

Та же логика сравнения – сначала сортировка по имени, а затем, во – вторых, по возрасту-также может быть реализована новой поддержкой композиции для Comparator .

Начиная с JDK 8, теперь мы можем объединить несколько компараторов для построения более сложной логики сравнения:

10. Сортировка Списка С Помощью Stream.sorted()

Мы также можем сортировать коллекцию с помощью Java 8 Течение отсортированный() ИНТЕРФЕЙС ПРИКЛАДНОГО ПРОГРАММИРОВАНИЯ.

Мы можем сортировать поток, используя естественный порядок, а также порядок, предоставляемый компаратором . Для этого у нас есть два перегруженных варианта sorted() API:

  • сортировкаed() сортирует элементы потока с использованием естественного упорядочения; класс элементов должен реализовать интерфейс Comparable .
  • сортировка(ComparatorsuperT>comparator) – сортировка элементов на основе экземпляра Comparator

Давайте рассмотрим пример того, как использовать метод sorted() с естественным упорядочением :

Теперь давайте посмотрим, как мы можем использовать пользовательский компаратор с sorted() API :

11. Сортировка списка в обратном порядке с помощью Stream.sorted()

Мы также можем использовать Поток.сортировка() чтобы отсортировать коллекцию в обратном порядке.

Во-первых, давайте рассмотрим пример того, как объединить метод sorted() с методом Comparator.ReverseOrder() для сортировки списка в обратном естественном порядке :

Теперь давайте посмотрим, как мы можем использовать метод sorted() и пользовательский компаратор :

Обратите внимание, что вызов compareTo переворачивается, что и делает обратное.

12. Нулевые значения

До сих пор мы реализовали наш Компаратор s таким образом, что они не могут сортировать коллекции, содержащие null значения. То есть, если коллекция содержит хотя бы один элемент null , то метод sort вызывает исключение NullPointerException :

Самым простым решением является обработка значений null вручную в нашей реализации Comparator :

Здесь мы перемещаем все элементы null в конец коллекции. Для этого компаратор считает, что null больше ненулевых значений. Когда оба null , они считаются равными.

Кроме того, мы можем передать любой Компаратор , который не является безопасным для null, в метод Comparator.nullsLast () | и получить тот же результат :

Аналогично, мы можем использовать Comparator.nullsFirst() для перемещения элементов null к началу коллекции:

Настоятельно рекомендуется использовать сначала нули() или нули Последние() декораторы, поскольку они более гибкие и, прежде всего, более читабельные.

13. Заключение

В этой статье проиллюстрированы различные и захватывающие способы сортировки списка с помощью лямбда – выражений Java 8 – переход от синтаксического сахара к реальной и мощной функциональной семантике.

Список сортировки Java, Естественная сортировка списка в Java с использованием метода Collections.sort() с использованием сопоставимого. Как отсортировать список объектов с помощью компаратора в Java.

Иногда нам приходится сортировать список на Java перед обработкой его элементов. В этом уроке мы узнаем, как сортировать список в естественном порядке. Мы также узнаем, как использовать вашу собственную реализацию компаратора для сортировки списка объектов.

Список Java похож на массивы, за исключением того, что длина списка является динамической и он поставляется в рамках коллекции Java . На самом деле, List-это интерфейс, и большую часть времени мы используем одну из его реализаций, такую как ArrayList или LinkedList и т. Д.

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

Здесь мы узнаем, как сортировать список объектов в Java. Мы можем использовать метод Collections.sort() для сортировки списка в естественном порядке возрастания. Все элементы в списке должны реализовывать Сопоставимый интерфейс, в противном случае будет выдано исключение IllegalArgumentException .

Давайте рассмотрим краткий пример сортировки списка строк.

Как вы можете видеть, мы используем метод Collections.sort() для сортировки списка строк. Класс String реализует Сопоставимый интерфейс.

Java Сортирует список объектов

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

Сортировка списка на Java с помощью компаратора

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

Поскольку Comparator является функциональным интерфейсом , мы можем использовать лямбда-выражения для записи его реализации в одной строке.

Объекты Списка Сортировки Java – Компаратор

Резюме

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

Читайте также: