Estoy tratando de enumerar los primeros 100 de una lista aleatoria. Le digo que se baraje si la lista está en 0 y luego se incrementa. Luego intento llamar a esa lista en otra sección de cuándo, pero no funciona. ¿Cómo puedo lograr esto?
when (countF) { 0 -> { //shuffle at 0 val randomChaos = chaosList.asSequence().shuffled().take(chaosList.count()).toList() cResult.text = randomChaos.elementAt(countF) + countF + "\n\n\n\n\n\n\n\n" + this.cResult.text countF++ } 1-99 -> { //show 1-99 cResult.text = randomChaos.elementAt(countF) + countF + "\n\n\n\n\n\n\n\n" + this.cResult.text countF++ } 100 -> countF = 0 var randomChaos = chaosList.shuffled() fun cShuf() { randomChaos = chaosList.shuffled() } cRoll.setOnClickListener() { cResult.movementMethod = ScrollingMovementMethod() if (countF < 1) { cShuf() } cResult.text = randomChaos.elementAt(countF) + "\n\n\n\n\n\n\n\n" + this.cResult.text countF++ if (countF > 100) countF = 0 }Descubrí cómo usar una función para generar una nueva reproducción aleatoria de la lista una vez que llegué a > 100 mostrados. Mi problema al convertirlo en una función fue que estaba tratando de usar la variable val en la función, pero la variable ya existía, así que no necesitaba usar val, solo el nombre de la variable.
Necesitaría crear el val randomChaos antes del recinto when para que esté disponible en el alcance de múltiples ramas de la instrucción when .
Dicho esto, la forma en que obtienes un elemento aleatorio es muy complicada. take(chaosList.count()) es completamente redundante. Y dado que no usa múltiples operadores de secuencia, crear una secuencia también es redundante. Finalmente, solo está extrayendo un elemento de la lista aleatoria, por lo que no es necesario crear una lista aleatoria en primer lugar. El uso elementAt() en una lista aleatoria no es diferente a elegir cualquier elemento de esa lista aleatoria, o simplemente elegir un elemento aleatorio de una lista que no está mezclada en absoluto.
Además, las dos primeras ramas de su instrucción when actualmente producirían exactamente los mismos resultados para que puedan fusionarse.
Según lo que describió, supongo que tenía esta instrucción when dentro de un bucle que intenta ejecutarlo 100 veces para que pueda enumerar todos los elementos. Para que eso funcione, necesitaría barajar la lista una vez fuera del ciclo, y luego podría iterar sus elementos en el ciclo.
Sin embargo, hay funciones que pueden hacer que sea más fácil hacer lo que sugieres. Aquí hay un ejemplo:
val randomChaos = chaosList.shuffled() cResult.text = randomChaos.asSequence() .take(100) .withIndex() .joinToString("\n") { (i, value) -> "$value-$i" }En este caso, el uso de una Secuencia ayuda a evitar la creación de una lista intermedia para contener los primeros 100 valores.