首页 文章

Kotlin密封类 - 如何按密封类进行排序,类似于按枚举排序

提问于
浏览
0

在java中,我们可以通过枚举轻松地对集合进行排序,如下所示:

Collections.sort(toSortEnumList, new Comparator<theEnum>() {
                @Override
                public int compare(theEnum o1, theEnum o2) {
                    return o1.ordinal().compareTo(o2.ordinal());
                }
            });

并且toSortEnumList将按升序排序 . 我怎么能用kotlin密封课做到这一点?这是我到目前为止尝试过的,我尝试按类名排序,但那不是枚举位置 . 必须有一些方法按枚举位置排序:

sealed class GoodCountries {

class Brazil:GoodCountries(){}

class USA : GoodCountries() {}

    class Germany : GoodCountries() {}

    class China : GoodCountries() {}

}

//later on

var toSortList = listOf(China(),Brazil(),USA(),Germany())

Collections.sort(
        toSortList,
        { x: GoodCountries, y: GoodCountries -> y::class.java.name.compareTo(x::class.java.name) })

    Log.v("myTag", toSortList.toString())

这打印:

美国德国,中国,巴西 - 降序 . 不是我想要的 . 我想按密封的类顺序排序(如enum java中的序号)我认为密封类应该比枚举更好但是如果我不能这样做,也许枚举有一个优势 . 谁有人可以帮忙?

but i want it to print: Brazil, USA, Germany, China

更新:如果我运行以下命令 GoodCountries::class.sealedSubclasses 我得到列表,但根据我的声明,它的顺序不正确 . 相反,我得到这个订单:

2 回答

  • 0

    您的问题的快速答案是在比较器中切换 xy ,即 x::class.java.name.compareTo(y::class.java.name)

    答案越长,对于您的用例,枚举可能会更好 . 当一些子类看起来与其他子类不同时,密封类会闪耀,并且拥有它们的多个实例是有意义的 . 例如 sealed class Result 具有子类 SuccessError ,其中 Success 包含数据而 Error 包含异常 . 假设你想要对所有国家都一视同仁,你的用例似乎更适合传统的枚举 .

  • 0

    也许不完全是你想要的,但也许它是...

    虽然密封的课程已经注意到了,但 class 本身也有sealedSubclasses(即 GoodCountries::class.sealedSubclasses ) . 此外,似乎sealedSubclasses的顺序是定义的类之一,即此列表中的 Brazil 始终排在第一位, USA 秒,等等 . 如果它们不是全部嵌套,则顺序不同(即,如果某些位于外部,他们列在第一) .

    但是:文档没有声明这种排序是故意选择的 . 既不是'Sealed classes' reference documentation也不是sealedSubclasses (k)documentation .

相关问题