首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据Kotlin中的第一个元素对2D mutableListof<Any>进行排序

如何根据Kotlin中的第一个元素对2D mutableListof<Any>进行排序
EN

Stack Overflow用户
提问于 2022-11-10 12:01:35
回答 3查看 35关注 0票数 0

如何根据数组的第一个元素对二维可变数组列表进行排序?

代码语言:javascript
复制
val books = mutableListOf<Any>(
  listof("abc","b",1),
  listof("abb","y",2),
  listof("abcl"."i",3)
)

我想按每个列表的第一个元素的字母顺序排序这个可变列表。

输出应该是

代码语言:javascript
复制
[listof("abb","y",2), listof("abc","b",1), listof("abcl"."i",3) ]
EN

回答 3

Stack Overflow用户

发布于 2022-11-10 12:17:17

你能做到的

代码语言:javascript
复制
books.sortBy { (it as List<*>).first() as String }
票数 0
EN

Stack Overflow用户

发布于 2022-11-10 12:24:42

这很困难,因为您的类型信息非常有限。

如果内部列表中的元素总是有三个类型为String、String、Integer的值,那么您可能应该使用一个三元组:

代码语言:javascript
复制
val books = mutableListOf<Triple<String, String, Int>>(
    Triple("abc","b",1),
    Triple("abb","y",2),
        Triple("abcl","i",3)
)

books.sortBy { t -> t.first }

如果内部列表总是列表,但具有不同的长度和类型,但众所周知,它们总是字符串,则可以执行以下操作

代码语言:javascript
复制
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>,那么您就无法进行比较:您不需要进行比较。

票数 0
EN

Stack Overflow用户

发布于 2022-11-10 20:46:26

你这里有两个问题:

  • 您的列表包含Any的元素,这并不意味着任何类型的“第一个元素”
  • ,您只能比较实现Comparable的东西(除非您传递自己的比较器,或者在排序函数中执行自己的比较逻辑)

首先,如果这个列表应该包含“元素列表”,那么您应该将其作为类型的一部分。我们可以使用一般的Collection类型(或者它扩展的Iterable类型):

代码语言:javascript
复制
val books = mutableListOf<Collection<Any>>(
  listof("abc","b",1),
  ...

不幸的是,这并不适用于数组,这是它们自己的事情。如果您希望能够进行混合和匹配,则需要保留MutableList<Any>类型,并在排序函数中执行一些类型检查:

代码语言:javascript
复制
// 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仅有的几种方法之一,因此,如果不能更具体地说明“列表”中的类型,至少可以对其进行排序。它是否会有任何用途,开箱即用取决于你在里面放的东西!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74388661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档