Сортировать массив, используя несколько условий, сравнивая поле элемента с внешним полем. - PullRequest
0 голосов
/ 25 июня 2019

Я хочу отсортировать массив в следующем порядке:

1.Вверху отображаются элементы с кодом, точно совпадающим с искомым текстом.

2. Ниже отображаются элементы с именем, точно совпадающим с искомым текстом.

3. Ниже отображаются элементы с кодом, начинающимся с искомого текста.

4. Ниже отображаются элементы с именем, начинающимся с искомого текста.

  1. Ниже показаны элементы с именем, содержащим искомый текст.

Я использовал приведенный ниже код для этого -

xyzArrayList.sortWith(compareBy<XYZ>{it.code==searchedText}.thenBy{it.name==searchedText}.thenBy {it.code?.startsWith(searchedText)}.thenBy{it.name?.startsWith(searchedText)}.thenBy { it.name?.contains(searchedText) })

Но приведенный выше код не сортирует список. Где я ошибаюсь и как мне выполнить мое требование?

1 Ответ

1 голос
/ 25 июня 2019

Возможно, вместо использования sortWith и thenBy, вы могли бы воспользоваться другой функцией расширения в Collections, которая называется partition.

Эта функция принимает предикат и создает Pair<List<T>, List<T>>, где первый список содержит элементы, которые соответствуют предикату, а второй список - все остальные элементы.

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

val cities = ["Berlin", "London", "Paris", "Rome", "Budapest", "Barcelona"]

// Here we apply a predicate to create the first partition
val searchQuery = "B"
val (matchingElements, nonMatchingElements) 
     = cities.partition { it == searchQuery } //([], ["Berlin", "London", "Paris", "Rome", "Budapest", "Barcelona"]

// Now potentially we could create another partition from the nonMatchingElements list
val (startingWithQuery, others) = nonMatchingElements
    .partition { it.startsWith(searchQuery) }

println(matchingElements) // []
println(startingWithQuery) // ["Berlin", "Budapest", "Barcelona"]
println(others) // ["London", "Paris", "Rome"]

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

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