मेरे पास एक सरणी है जिसे मैं यादृच्छिक रूप से क्रमबद्ध करना चाहता हूं। जावा में, एक विधि Collections.shuffle() है जो किसी सूची के तत्वों को यादृच्छिक रूप से घुमा सकती है। यह भी एक सरणी पर इस्तेमाल किया जा सकता:जावा संग्रह। शफल() को स्कैला सरणी पर कैसे उपयोग करें?
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));
मैं एक स्काला सरणी पर इस का उपयोग कर कोशिश की, लेकिन स्काला दुभाषिया एक लंबा जवाब के साथ प्रतिक्रिया करता है:
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))
^
वास्तव में क्या यहाँ हो रहा है? मैं अपने कोड को एक विशेष ध्वज (-Xno-varargs-conversion) के साथ संकलित नहीं करना चाहता, अगर यह समाधान है, तो बस इसका समाधान है।
तो, मैं स्कैला सरणी पर जावा के संग्रह। शफल() का उपयोग कैसे करूं?
मैं स्काला में अपने ही फेरबदल विधि लिखा था इस बीच में:
// 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
}
यह जगह में सरणी shuffles, और सुविधा के लिए सरणी ही देता है। एक के तत्व प्रकार scala.AnyRef (java.lang.Object के बराबर) का एक उपवर्ग हो गया है
ध्यान दें कि इस तरह से फेरबदल केवल संदर्भ के प्रकार के सरणियों के लिए काम करता है। – starblue
@starblue: हां, जावा संस्करण केवल संदर्भ प्रकारों के सरणी के लिए काम करता है। मेरा स्वयं का स्काला शफल() विधि प्राइमेटिव के साथ स्कैला सरणी के साथ भी काम करता है। – Jesper