// 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")
}
}
3条答案
按热度按时间jogvjijk1#
你可以做
wz1wpwve2#
这很困难,因为您的类型信息非常有限。
如果内部列表的元素总是有String、String、Integer类型的三个值,则可能应该使用三元组:
如果内部列表总是列表,但具有不同的长度和类型,* 但已知它们总是字符串 *,则可以执行如下操作
如果你不知道任何类型的信息,而书籍确实是
MutableList<Any>
,那么你就无法进行比较:你不知道你在比较什么。kx7yvsdv3#
这里有两个问题:
Any
的元素,这并不意味着任何类型的“第一个元素”Comparable
的对象(除非您传入自己的比较器,或者在排序函数中执行自己的比较逻辑)首先,如果这个列表真的应该保存“元素列表”,那么你应该把它作为类型的一部分。我们可以使用通用的
Collection
类型(或者它扩展的Iterable
类型):不幸的是,这对数组不起作用,因为数组是独立的。如果你想混合和匹配,你需要保留
MutableList<Any>
类型,并在sort函数中做一些类型检查:这个例子也演示了第二个问题--如何对一堆
Any
进行排序。既然你说要按字母顺序对它们进行排序(除了字符串和数字之外,你不知道要放入什么),一种方法是对所有内容调用toString()
。这是
Any
拥有的少数几个方法之一,所以如果你不能更具体地描述你的“列表”中的类型,你至少可以对它进行排序。