From 36406c82d5143cbdeb1109d61bb0c0d5cf245b7b Mon Sep 17 00:00:00 2001 From: Ruslan Sennov Date: Tue, 23 May 2017 22:58:06 +0300 Subject: [PATCH] revert to very old algorithm #1995 --- .../main/java/io/vavr/collection/Array.java | 62 +++---------------- 1 file changed, 9 insertions(+), 53 deletions(-) diff --git a/vavr/src/main/java/io/vavr/collection/Array.java b/vavr/src/main/java/io/vavr/collection/Array.java index a7e92eea50..9ea70332ed 100644 --- a/vavr/src/main/java/io/vavr/collection/Array.java +++ b/vavr/src/main/java/io/vavr/collection/Array.java @@ -984,63 +984,19 @@ public Array peek(Consumer action) { @Override public Array> permutations() { - final Array src = distinct(); - if (src.isEmpty()) { - return Array.empty(); - } else if (src.size() == 1) { - return Array.of(src); + if (isEmpty()) { + return empty(); + } else if (delegate.length == 1) { + return of(this); } else { - java.util.List> result = new java.util.ArrayList<>(); - int[] pi = new int[src.size()]; - - // see Narayana algo - // https://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order - - for (int i = 0; i < pi.length; i++) { - pi[i] = i; - } - - int i, j; - while (true) { - Object[] next = new Object[src.size()]; - for (int k = 0; k < next.length; k++) { - next[k] = src.delegate[pi[k]]; - } - result.add(wrap(next)); - - i = pi.length - 2; - while (i >= 0 && pi[i] > pi[i + 1]) { - i--; - } - if (i < 0) { - break; - } - - j = pi.length - 1; - while (pi[i] > pi[j]) { - j--; - } - swapIndices(pi, i, j); - - i++; - j = pi.length - 1; - while (i < j) { - swapIndices(pi, i, j); - i++; - j--; - } - } - - return Array.ofAll(result); + final Array> zero = empty(); + return distinct().foldLeft(zero, (xs, x) -> { + final Function, Array> prepend = l -> l.prepend(x); + return xs.appendAll(remove(x).permutations().map(prepend)); + }); } } - private static void swapIndices(int[] arr, int i, int j) { - int t = arr[i]; - arr[i] = arr[j]; - arr[j] = t; - } - @Override public Array prepend(T element) { return insert(0, element);