如何根据数组的第一个元素对二维可变数组列表进行排序?
val books = mutableListOf<Any>(
listof("abc","b",1),
listof("abb","y",2),
listof("abcl"."i",3)
)我想按每个列表的第一个元素的字母顺序排序这个可变列表。
输出应该是
[listof("abb","y",2), listof("abc","b",1), listof("abcl"."i",3) ]发布于 2022-11-10 12:17:17
你能做到的
books.sortBy { (it as List<*>).first() as String }发布于 2022-11-10 12:24:42
这很困难,因为您的类型信息非常有限。
如果内部列表中的元素总是有三个类型为String、String、Integer的值,那么您可能应该使用一个三元组:
val books = mutableListOf<Triple<String, String, Int>>(
Triple("abc","b",1),
Triple("abb","y",2),
Triple("abcl","i",3)
)
books.sortBy { t -> t.first }如果内部列表总是列表,但具有不同的长度和类型,但众所周知,它们总是字符串,则可以执行以下操作
val books = mutableListOf<List<Any>>(
listOf("abc","b",1),
listOf("abb","y",2),
listOf("abcl","i",3)
)
books.sortBy { t -> t.first() as String }如果您不知道任何类型的信息,而且书籍确实是一个MutableList<Any>,那么您就无法进行比较:您不需要进行比较。
发布于 2022-11-10 20:46:26
你这里有两个问题:
Any的元素,这并不意味着任何类型的“第一个元素”Comparable的东西(除非您传递自己的比较器,或者在排序函数中执行自己的比较逻辑)首先,如果这个列表应该包含“元素列表”,那么您应该将其作为类型的一部分。我们可以使用一般的Collection类型(或者它扩展的Iterable类型):
val books = mutableListOf<Collection<Any>>(
listof("abc","b",1),
...不幸的是,这并不适用于数组,这是它们自己的事情。如果您希望能够进行混合和匹配,则需要保留MutableList<Any>类型,并在排序函数中执行一些类型检查:
// all kinds of things going in here
val books = mutableListOf<Any>(
listOf("abc","b",1),
arrayOf("abb","y",2),
setOf("abcl","i",3)
)
books.sortedBy {
when(it) {
is Collection<*> -> it.first().toString()
is Array<*> -> it.first().toString()
// or your fallback could just be it.toString()
else -> throw Exception("can't compare this thing")
}
}这个例子也说明了你的第二个问题--如何对一堆Any进行排序。既然你说要按字母顺序排序(除了字符串和数字之外,你还不知道要放什么),一种方法就是在所有事情上调用toString()。
这是Any仅有的几种方法之一,因此,如果不能更具体地说明“列表”中的类型,至少可以对其进行排序。它是否会有任何用途,开箱即用取决于你在里面放的东西!
https://stackoverflow.com/questions/74388661
复制相似问题