使用多个条件对数组列表进行排序,将项目的字段与外部字段进行比较

时间:2019-06-25 11:39:58

标签: android sorting arraylist kotlin

我想按以下顺序对数组列表进行排序-

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 个答案:

答案 0 :(得分:1)

也许可以不用使用sortWiththenBy,而可以利用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"]

创建所需的所有分区后,现在可以按正确的顺序从所需的所有分区中生成一个列表,或使用分隔符显示这些不同的列表。