Tôi có một mảng mà tôi muốn hoán vị ngẫu nhiên. Trong Java, có một phương thức Collections.shuffle() có thể trộn ngẫu nhiên các phần tử của một List một cách ngẫu nhiên. Nó có thể được sử dụng trên một mảng quá:Làm thế nào để sử dụng Java Collections.shuffle() trên một mảng 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));
tôi đã cố gắng sử dụng này trên một mảng Scala, nhưng người phiên dịch Scala trả lời bằng một câu trả lời dài:
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))
^
gì chính xác đang xảy ra ở đây? Tôi không muốn biên dịch mã của tôi với một lá cờ đặc biệt (-Xno-varargs-conversion), nếu đó là giải pháp ở tất cả, chỉ vì điều này.
Vì vậy, làm cách nào để sử dụng Bộ sưu tập của Java.shuffle() trên một mảng Scala?
tôi đã viết phương pháp ngẫu nhiên của riêng tôi trong Scala trong khi chờ đợi:
// 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
}
Nó shuffles mảng tại chỗ, và trả về mảng chính nó cho thuận tiện.
Lưu ý rằng việc xáo trộn theo cách này chỉ hoạt động đối với các loại tham chiếu. – starblue
@ starblue: Có, phiên bản Java chỉ hoạt động đối với các loại tham chiếu. Phương thức Scala shuffle() của riêng tôi cũng làm việc với các mảng Scala với các nguyên thủy. – Jesper