【发布时间】:2018-12-09 01:43:01
【问题描述】:
在 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<GoodCountries>(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())
打印出来:
美国、德国、中国、巴西
降序。不是我想要的。我想按密封的类顺序(如 Java 枚举中的序号)排序,如下所示:
巴西、美国、德国、中国
我认为密封类应该比枚举更好,但如果我不能做到这一点,枚举可能会有优势。
更新:多亏了 Roland 的帮助,我才得以找到密封类的列表。但现在我想对其进行排序:这是我目前所拥有的:
Collections.sort(toSortList, object : Comparator<GoodCountries> {
override fun compare(left: GoodCountries, right: GoodCountries): Int {
return Integer.compare(
GoodCountries::class.sealedSubclasses.indexOf(left),
GoodCountries::class.sealedSubclasses.indexOf(right)
)
}
})
但我在indexOf 收到以下错误:
类型推断失败。类型参数 T 的值应在输入类型(参数类型、接收者类型或预期类型)中提及。尝试明确指定它。
【问题讨论】: