我有給定的陣列
val things = arrayOf<Any>("Jack", 8, 2, 6, "King", 5, 3, "Queen", "Jack");
下面是我使用的代碼
things.set(things.indexOf("Jack"), 11);
things.set(things.indexOf("Queen"), 12);
things.set(things.indexOf("King"), 13);
things.sort();
things.set(things.indexOf(11), "Jack"));
things.set(things.indexOf(12), "Queen");
things.set(things.indexOf(13), "King");
things.joinToString(":");
things.forEach { System.out.print(it) }
這是我不斷收到的錯誤
Unexpected tokens (use ';' to separate expressions on the same line)
Expecting an element
洗掉尾括號后,我現在收到以下錯誤
Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')
at java.lang.String.compareTo (:-1)
at java.util.ComparableTimSort.binarySort (:-1)
at java.util.ComparableTimSort.sort (:-1)
uj5u.com熱心網友回復:
您Jack的串列中有 2 個,因此當您使用 時indexOf(),它會回傳該專案第一次出現的索引。
things.set(things.indexOf("Jack"), 11);
things.set(things.indexOf("Queen"), 12);
things.set(things.indexOf("King"), 13);
這會將您的串列更改為
[11, 8, 2, 6, 13, 5, 3, 12, Jack]
現在,當您sort()對things. 它拋出ClassCastException,Jack因為它是一個string,而不是一個int。
要查找indexes一個值的所有內容,以便替換它們,您可以創建一個extension函式,該函式回傳一個值的所有索引串列。
fun <T> Array<T>.indexesOfAll(predicate: (T) -> Boolean): List<Int> {
return mapIndexedNotNull { index, any ->
index.takeIf {
predicate(any)
}
}
}
現在,您可以使用此indexesOfAll函式來獲取indexes特定條件的所有專案。
things.indexesOfAll { it == "Jack" }.forEach {
things.set(it, 11)
}
您也可以對所有其他值執行相同的操作。
uj5u.com熱心網友回復:
問題是你有兩次“杰克”。things.set(things.indexOf("Jack"), 11);只將第一個更改為 11,而不是第二個。
val things = arrayOf<Any>("Jack", 8, 2, 6, "King", 5, 3, "Queen", "Jack");
things.set(things.indexOf("Jack"), 11);
things.set(things.indexOf("Queen"), 12);
things.set(things.indexOf("King"), 13);
println(things.contentToString()) //prints [11, 8, 2, 6, 13, 5, 3, 12, Jack]
現在,我可能會怎么做,是這樣的:
fun main() {
val things = arrayOf("Jack", 8, 2, 6, "King", 5, 3, "Queen", "Jack")
things.sortWith(compareBy { it.toInt() })
println(things.contentToString()) //prints [2, 3, 5, 6, 8, Jack, Jack, Queen, King]
}
val mapping = mapOf("Jack" to 11, "Queen" to 12, "King" to 13)
fun Any.toInt() : Int {
if (this is Int) return this
return mapping[this] ?: 0
}
uj5u.com熱心網友回復:
即使其他答案解決了手頭的問題,也有一個基本問題在起作用。通常,您希望避免使用多型別陣列(或任何型別的集合)。更好的解決方案是引入和抽象以將兩種型別的資料表示為同一個類,并使該類實作Comparable介面。
一個實作示例:
sealed class Card(val name: String) : Comparable<Card> {
abstract val order: Int
override fun compareTo(other: Card): Int =
order - other.order
override fun toString(): String = name
class Number(value: Int) : Card(value.toString()) {
override val order: Int = value
}
object Ace : Card("Ace") {
override val order: Int = 1
}
object Jack : Card("Jack") {
override val order: Int = 11
}
object Queen : Card("Queen") {
override val order: Int = 12
}
object King : Card("King") {
override val order: Int = 13
}
}
那么你可以像這樣使用它:
println(listOf(Card.Number(2), Card.Ace, Card.Queen, Card.Number(3)).sorted())
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/468046.html
上一篇:反轉部分鍵的排序順序
