Может быть, не совсем то, что вы ищете, но, возможно, это ...
Хотя запечатанные классы, похоже, не имеют чего-то вроде ординала, который вы уже заметили, есть sealedSubclasses
на самом class
(т.е. GoodCountries::class.sealedSubclasses
).Кроме того, создается впечатление, что порядок sealedSubclasses
относится к определенным классам, то есть Brazil
в этом списке всегда идет первым, USA
секунда и т. Д. Порядок отличается, еслиони не все вложенные (то есть, если некоторые находятся снаружи, они перечислены первыми).
Однако: в документации не указано, что этот порядок был выбран намеренно.Ни в справочной документации «Запечатанные классы» , ни в sealedSubclasses
(k) документации .
Относительно вашего вопроса о сортировке объектов в порядке запечатанных классов,Вы можете использовать что-то вроде следующего:
val entityList = listOf(Germany(), China(), USA(), Brazil(), Germany())
entityList.sortedBy { // or use sortedWith(compareBy {
GoodCountries::class.sealedSubclasses.indexOf(it::class)
}.forEach(::println) // or toList...
или что-то вроде:
GoodCountries::class.sealedSubclasses
.asSequence()
.flatMap { klazzInOrder ->
entityList.asSequence().filter { it::class == klazzInOrder }
}
.forEach(::println)
Оба могут быть не лучшим выбором в отношении производительности, но я думаю, вы поняли идею.
Примеры сортировки, которые я добавил ранее (когда я не осознавал, что вы на самом деле хотите сортировать объекты вместо типов):
println("Listing the sealed classes in the order of their declaration*")
GoodCountries::class.sealedSubclasses.forEach(::println)
println("Listing the sealed classes ordered by their simple name")
GoodCountries::class.sealedSubclasses.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER) { it.simpleName!! })
.forEach(::println)
// same result, but written differently
GoodCountries::class.sealedSubclasses.sortedBy { it.simpleName?.toLowerCase() }
.forEach(::println)
Возможно, вы даже захотите объединить nullsLast
и CASE_INSENSITIVE_ORDER
(скорее всего, если вы не имеете дело с запечатанными классами), в этом случае вы должны написать что-то вроде:
GoodCountries::class.sealedSubclasses.sortedWith(compareBy(nullsLast(String.CASE_INSENSITIVE_ORDER)) { it.simpleName })
.forEach(::println)