Tengo una matriz que quiero permuta aleatoriamente. En Java, hay un método Collections.shuffle() que puede mezclar aleatoriamente los elementos de una Lista. Puede ser utilizado en una gran variedad demasiado:¿Cómo usar Java Collections.shuffle() en una matriz de Scala?
String[] array = new String[]{"a", "b", "c"};
// Shuffle the array; works because the list returned by Arrays.asList() is backed by the array
Collections.shuffle(Arrays.asList(array));
He intentado utilizar esto en una matriz Scala, pero el intérprete Scala responde con una respuesta larga:
scala> val a = Array("a", "b", "c")
a: Array[java.lang.String] = Array(a, b, c)
scala> java.util.Collections.shuffle(java.util.Arrays.asList(a))
<console>:6: warning: I'm seeing an array passed into a Java vararg.
I assume that the elements of this array should be passed as individual arguments to the vararg.
Therefore I follow the array with a `: _*', to mark it as a vararg argument.
If that's not what you want, compile this file with option -Xno-varargs-conversion.
java.util.Collections.shuffle(java.util.Arrays.asList(a))
^
<console>:6: error: type mismatch;
found : Array[java.lang.String]
required: Seq[Array[java.lang.String]]
java.util.Collections.shuffle(java.util.Arrays.asList(a))
^
¿Qué es exactamente que está pasando aquí? No quiero compilar mi código con una bandera especial (-Xno-varargs-conversion), si esa es la solución, solo por eso.
Entonces, ¿cómo utilizo Collections.shuffle() de Java en una matriz de Scala?
escribí mi propio método shuffle en Scala en el ínterin:
// Fisher-Yates shuffle, see: http://en.wikipedia.org/wiki/Fisher–Yates_shuffle
def shuffle[T](array: Array[T]): Array[T] = {
val rnd = new java.util.Random
for (n <- Iterator.range(array.length - 1, 0, -1)) {
val k = rnd.nextInt(n + 1)
val t = array(k); array(k) = array(n); array(n) = t
}
return array
}
Se baraja la matriz en su lugar, y devuelve la matriz en sí para mayor comodidad.
Tenga en cuenta que mezclar de esta manera solo funciona para matrices de tipos de referencia. – starblue
@starblue: Sí, la versión de Java funciona solo para matrices de tipos de referencia. Mi propio método Scala shuffle() también funciona con matrices Scala con primitivas. – Jesper