如何按陣列的第一個元素對二維可變陣列串列進行排序?
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) ]
uj5u.com熱心網友回復:
你可以做
books.sortBy { (it as List<*>).first() as String }
uj5u.com熱心網友回復:
這很困難,因為您的型別資訊非常有限。
如果內部串列的元素始終具有 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 }
如果您不知道任何型別資訊,并且 books 確實是 a MutableList<Any>,那么您就無法比較:您不知道要比較的內容。
uj5u.com熱心網友回復:
你這里有兩個問題:
- 您的串列包含 的元素
Any,這并不意味著任何型別的“第一個元素” - 你只能比較實作的東西
Comparable(除非你傳入你自己的比較器,或者在排序函式中做你自己的比較邏輯)
首先,如果這個串列真的應該包含“元素串列”,那么你應該把它作為型別的一部分。我們可以使用通用Collection型別(或Iterable它擴展的型別):
val books = mutableListOf<Collection<Any>>(
listof("abc","b",1),
...
不幸的是,這不適用于陣列,這是他們自己的事情。如果希望能夠混搭,則需要保留MutableList<Any>型別,并在 sort 函式中進行一些型別檢查:
// 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")
}
}
該示例也演示了您的第二個問題 - 如何對一堆Anys 進行排序。既然您說您希望它們按字母順序排序(并且不知道除了字串和數字之外您將在其中放入什么),一種方法就是呼叫toString()所有內容。
這是為數不多的方法之一Any,因此如果您不能更具體地了解“串列”中的型別,您至少可以對其進行排序。開箱即用是否有任何用途取決于您放入其中的物件!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/531686.html
標籤:科特林排序可变列表
