Как использовать Java Collections.shuffle () на массиве Scala?

Эволюция языка Java была медленной, но сознательно так.

Дженерики обеспечивает хороший пример. Совместимость с предыдущими версиями Java была требованием. , Учитывая цели проекта , реализация дженериков выполняет очень полезную функцию точно, как разработано. Однако это не оправдывает надежды многих разработчиков, которые ожидали поведение овеществленных дженериков.

Инновации в JVM, с другой стороны, были чрезвычайно быстры, часто следуя впереди для другого VMs, и способствуя конкуренции на арене производительности.

, По-моему, язык Java должен быть максимально стабильным. Мне нравится идея закрытий, но я не полагаю, что Java является языком для них. (Если бы что-то должно войти, я предпочел бы консервативный FCM.) Я работаю с командой разработчиков, которым нужно обучение, чтобы создать и поддержать сложное производственное приложение. Язык Java дает нам хорошее смешение питания и структуры как есть

, Другие языки, как Scala и Groovy и порты к JVM как Ruby и Python, продолжат давать жизнь платформе Java, даже после того, как сам язык Java пошел путем КОБОЛа.

11
задан Eugene Yokota 15 December 2010 в 20:15
поделиться

3 ответа

java.util.Collections.shuffle(java.util.Arrays.asList(a:_*))

Для правильной работы вышеуказанного Тип элемента a должен быть подклассом scala.AnyRef (эквивалент java.lang.Object), потому что Arrays.asList () использует переданный массив в качестве резервного хранилища для результата java.util.List и java.util.List может содержать только ссылки на объекты (не примитивные значения). *

Это также причина, по которой Collections.shuffle (), который перемешивает переданный java.util.List, фактически перемешивает массив. *

*: См. примечание ниже

Например:

scala> val a = Array[java.lang.Integer](1, 2, 3) // note the type parameter                  
a: Array[java.lang.Integer] = Array(1, 2, 3)

scala> java.util.Collections.shuffle(java.util.Arrays.asList(a:_*))

scala> a
res43: Array[java.lang.Integer] = Array(1, 3, 2)

scala> java.util.Collections.shuffle(java.util.Arrays.asList(a:_*))

scala> a
res45: Array[java.lang.Integer] = Array(1, 2, 3)

Примечание: Scala 2.7.5 используется для приведенных выше фрагментов кода. Scala 2.8.0 демонстрирует другое поведение, как продемонстрировал Дэниел. На всякий случай, не зависят от того, что массив перетасовывается, а вместо этого перетасовывается список, возвращаемый из Arrays.asList ().

scala> val a = Array[java.lang.Integer](1, 2, 3)
a: Array[java.lang.Integer] = Array(1, 2, 3)

scala> val b = java.util.Arrays.asList(a:_*)
b: java.util.List[java.lang.Integer] = [1, 2, 3]

scala> java.util.Collections.shuffle(b)

scala> b
res50: java.util.List[java.lang.Integer] = [2, 1, 3]

scala> java.util.Collections.shuffle(b)

scala> b
res52: java.util.List[java.lang.Integer] = [3, 1, 2]
6
ответ дан 3 December 2019 в 07:13
поделиться

Кажется, Scala делает что-то отличное от Java, когда дело касается varargs. По крайней мере, я никак не могу перетасовать этот массив. Предположительно, перемешивание в списке приведет к перемешиванию массива, потому что список поддерживается массивом. Что ж, похоже, что Scala создаст массив new при передаче аргументов vararg в Java, что сделает вышеупомянутый пример бесполезным.

scala> val b = java.util.Arrays.asList(a: _*)
b: java.util.List[java.lang.String] = [a, b, c]

scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(a, b, c) [a, b, c]

scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(a, b, c) [c, b, a]

scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(a, b, c) [a, c, b]

scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(a, b, c) [b, a, c]

scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(a, b, c) [a, b, c]

scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(a, b, c) [c, a, b]

Он действительно работает с Ints, хотя и утверждается иначе:

scala> val a = Array(1,2,3)
a: Array[Int] = Array(1, 2, 3)

scala> val b = java.util.Arrays.asList(a: _*)
b: java.util.List[Int] = [1, 2, 3]

scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(1, 2, 3) [2, 3, 1]

scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(1, 2, 3) [3, 2, 1]

scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(1, 2, 3) [3, 2, 1]

scala> java.util.Collections.shuffle(b); println(a.toString+" "+b.toString)
Array(1, 2, 3) [1, 2, 3]

В Scala 2.8 есть более простой способ:

scala> scala.util.Random.shuffle(a)
res32: Sequence[Int] = Array(1, 2, 3)

scala> scala.util.Random.shuffle(a)
res33: Sequence[Int] = Array(2, 1, 3)

scala> scala.util.Random.shuffle(a)
res34: Sequence[Int] = Array(3, 2, 1)

Обратите внимание, что в стиле Scala он не изменяет исходный массив.

6
ответ дан 3 December 2019 в 07:13
поделиться

Чтобы ответить на вопрос "что именно здесь происходит?" part:

Когда вы говорите java.util.Arrays.asList (a), вы вызываете статический метод Java, который определен для приема переменного числа аргументов (синтаксис vararg ... в Java):

public static <T> List<T> asList(T... a) 

В Scala, когда вы вызываете asList, вы передаете один Array [String], а не три строковых параметра. Несмотря на то, что Scala представляет T * как Array [T], вам нужно сообщить компилятору, что вы действительно хотите передать три параметра, а не один параметр, который является списком из трех вещей.

В Scala есть удобный способ преобразовать ваш Array [String] в String, String, String: вы используете символ _ *, как показано в ответе Уолтера Чанга. Вы можете использовать его всякий раз, когда передаете что-нибудь в функцию vararg.

5
ответ дан 3 December 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: