我想排序一些包含数字的字符串,但经过排序后,它变得像 ["s1", "s10", "s11", ... ,"s2", "s21", "s22"]
. 在我搜索之后我将这个question同样的问题 . 但在我的例子中,我有 mutableList<myModel>
,我必须将 myModel.title
中的所有字符串放入一个可变列表并放入代码中:
val sortData = reversedData.sortedBy {
//pattern.matcher(it.title).matches()
Collections.sort(it.title, object : Comparator<String> {
override fun compare(o1: String, o2: String): Int {
return extractInt(o1) - extractInt(o2)
}
fun extractInt(s: String): Int {
val num = s.replace("\\D".toRegex(), "")
// return 0 if no digits found
return if (num.isEmpty()) 0 else Integer.parseInt(num)
}
})
}
我在 .sortedBy
和 Collections.sort(it.title)
有错误,请帮我解决这个问题 .
4 回答
基于您发布的数据的可能解决方案:
当然我会把正则表达式从lambda中移出来,但这是一个更简洁的答案 .
您可以使用
sortWith
而不是sortBy,例如:})
会给出输出:
[s1, s21, s22, s23, s101, s131, s321]
当你声明你需要一个MutableList,但还没有MutableList时,你应该使用sortedBy或sortedWith(如果你想使用比较器)而你只得到一个(新的)列表,例如:
你可能想利用compareBy(或Javas
Comparator.comparing
)来获得sortedWith
.如果您只想对现有的可变列表进行排序,请使用sortWith(或
Collections.sort
):当然你也可以玩其他比较器助手(例如混合空值,或类似),例如:
对于上面的示例,我使用了以下Regex:
一个可能的解决方案是: