You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2024/01/23 22:46:58 UTC

(groovy) branch master updated: GROOVY-11296: DGM: `shuffled` preserves input order

This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/master by this push:
     new b39bef39b5 GROOVY-11296: DGM: `shuffled` preserves input order
b39bef39b5 is described below

commit b39bef39b5a22bd53769298d43a8192cbedecb63
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Jan 23 16:46:24 2024 -0600

    GROOVY-11296: DGM: `shuffled` preserves input order
---
 .../groovy/runtime/ArrayGroovyMethods.java         | 24 ++++++++++++----------
 .../groovy/runtime/DefaultGroovyMethods.java       | 20 ++++++++++--------
 2 files changed, 25 insertions(+), 19 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/runtime/ArrayGroovyMethods.java b/src/main/java/org/codehaus/groovy/runtime/ArrayGroovyMethods.java
index ca16a4b9a9..7ec9494531 100644
--- a/src/main/java/org/codehaus/groovy/runtime/ArrayGroovyMethods.java
+++ b/src/main/java/org/codehaus/groovy/runtime/ArrayGroovyMethods.java
@@ -7002,10 +7002,12 @@ public class ArrayGroovyMethods extends DefaultGroovyMethodsSupport {
     /**
      * Creates a new array containing the elements of the specified array but in a random order.
      * <pre class="groovyTestCase">
-     * Integer[] orig = [10, 5, 20]
-     * def array = orig.shuffled()
-     * assert orig.size() == array.size()
-     * assert orig.every{ array.contains(it) }
+     * Integer[] array = [10, 5, 20]
+     * def result = array.shuffled()
+     * assert array !== result
+     * assert array.length == result.length
+     * assert array.every{ result.contains(it) }
+     * assert array == new Integer[] {10, 5, 20}
      * </pre>
      *
      * @param self an array
@@ -7024,10 +7026,12 @@ public class ArrayGroovyMethods extends DefaultGroovyMethodsSupport {
      * order using the specified random instance as the source of randomness.
      * <pre class="groovyTestCase">
      * def r = new Random()
-     * Integer[] orig = [10, 5, 20]
-     * def array = orig.shuffled(r)
-     * assert orig.size() == array.size()
-     * assert orig.every{ array.contains(it) }
+     * Integer[] array = [10, 5, 20]
+     * def result = array.shuffled(r)
+     * assert array !== result
+     * assert array.length == result.length
+     * assert array.every{ result.contains(it) }
+     * assert array == new Integer[] {10, 5, 20}
      * </pre>
      *
      * @param self an array
@@ -7036,9 +7040,7 @@ public class ArrayGroovyMethods extends DefaultGroovyMethodsSupport {
      */
     public static <T> T[] shuffled(T[] self, Random rnd) {
         T[] result = self.clone();
-        List<T> items = Arrays.asList(self);
-        Collections.shuffle(items, rnd);
-        System.arraycopy(items.toArray(), 0, result, 0, items.size());
+        Collections.shuffle(Arrays.asList(result), rnd);
         return result;
     }
 
diff --git a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
index c14097fb2f..424bcdb476 100644
--- a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
+++ b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
@@ -11636,10 +11636,12 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
      * Creates a new list containing the elements of the specified list
      * but in a random order.
      * <pre class="groovyTestCase">
-     * def orig = ["a", 4, false]
-     * def shuffled = orig.shuffled()
-     * assert orig.size() == shuffled.size()
-     * assert orig.every{ shuffled.contains(it) }
+     * def list = ["a", 4, false]
+     * def result = list.shuffled()
+     * assert list !== result
+     * assert list == ["a", 4, false]
+     * assert list.size() == result.size()
+     * assert list.every{ result.contains(it) }
      * </pre>
      *
      * @param self a List
@@ -11657,10 +11659,12 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
      * order using the specified random instance as the source of randomness.
      * <pre class="groovyTestCase">
      * def r = new Random()
-     * def orig = ["a", 4, false]
-     * def shuffled = orig.shuffled(r)
-     * assert orig.size() == shuffled.size()
-     * assert orig.every{ shuffled.contains(it) }
+     * def list = ["a", 4, false]
+     * def result = list.shuffled(r)
+     * assert list !== result
+     * assert list == ["a", 4, false]
+     * assert list.size() == result.size()
+     * assert list.every{ result.contains(it) }
      * </pre>
      *
      * @param self a List