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

j5fpnvbx  于 2022-11-16  发布在  Kotlin
关注(0)|答案(3)|浏览(152)

我如何排序二维数组可变列表的第一个元素的数组?

val books = mutableListOf<Any>(
  listof("abc","b",1),
  listof("abb","y",2),
  listof("abcl"."i",3)
)

我想把这个mutablelist按照每个列表中第一个元素的字母顺序排序。
输出应

[listof("abb","y",2), listof("abc","b",1), listof("abcl"."i",3) ]
jogvjijk

jogvjijk1#

你可以做

books.sortBy { (it as List<*>).first() as String }
wz1wpwve

wz1wpwve2#

这很困难,因为您的类型信息非常有限。
如果内部列表的元素总是有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>,那么你就无法进行比较:你不知道你在比较什么。

kx7yvsdv

kx7yvsdv3#

这里有两个问题:

  • 您的列表包含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")
   }
}

这个例子也演示了第二个问题--如何对一堆Any进行排序。既然你说要按字母顺序对它们进行排序(除了字符串和数字之外,你不知道要放入什么),一种方法是对所有内容调用toString()
这是Any拥有的少数几个方法之一,所以如果你不能更具体地描述你的“列表”中的类型,你至少可以对它进行排序。

相关问题