【问题标题】:Filter list of string with contains and sorted by contains position过滤包含包含并按包含位置排序的字符串列表
【发布时间】:2020-04-14 11:46:26
【问题描述】:

我有一个字符串列表说

var list = mutableListOf("clock", "kite", "rekt")

现在,我需要根据字符过滤列表。目前我正在过滤:

list.filter { it.contains("k") }

它给了我结果

[clock, kite, rekt]

但这是我有问题的地方,我想过滤列表并按其字符位置排序,预期结果是

[kite, rekt, clock]

字符“k”首先出现的位置是列表中的第一个,依此类推。

我很困惑该怎么做。先感谢您。

【问题讨论】:

    标签: android sorting kotlin


    【解决方案1】:

    要对其进行排序,您必须使用Comparator。比较器合约在方法 compare here

    中进行了描述

    比较它的两个参数的顺序。如果参数相等,则返回零,如果第一个参数小于第二个,则返回负数,如果第一个参数大于第二个,则返回正数。

    因此,在我们的例子中,我们使用两个字符串 ab,然后查看 k 的位置。

    示例:

    a = "clock" // position of 'k' is 4
    b = "kite" // position of 'k' is 0
    

    比较这两个 4 - 0 = 4 得到一个正数,这意味着第一个参数大于第二个。

    a = "kite" // position of 'k' is 0
    b = "rekt" // position of 'k' is 3
    

    比较这两个0 - 3 = -3 得到一个负数,这意味着第一个参数小于第二个。

    代码:

    var list = mutableListOf("clock", "kite", "rekt", "abcd")
    list.retainAll { it.contains("k") }
    
    // Ascending Order
    list.sortWith(Comparator {a, b -> a.indexOf('k') - b.indexOf('k')})
    println(list) // [kite, rekt, clock]
    
    // Descending Order
    list.sortWith(Comparator {a, b -> b.indexOf('k') - a.indexOf('k')})
    println(list) // [clock, rekt, kite]
    
    // Cleaner and more concise syntax thanks to @Tenfour04
    list.sortWith( compareBy { it.indexOf('k') } )
    list.sortWith( compareByDescending { it.indexOf('k') } )
    

    【讨论】:

    • 如果要就地过滤,需要使用retainAll而不是filter。在上面的代码中,filter 调用创建了一个新列表,该列表立即丢失给 GC,sortWith 调用在原始列表上完成。
    • 您也可以使用compareBy { it.indexOf('k') } 代替Comparator 调用以获得更简洁的表达式。还有compareByDescending
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 2020-06-14
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多