Если допустимо сначала отсортировать элементы лексически, то вы можете выполнить свою лексическую перестановку.Включая алгоритм, который делает это для массива int, легко модифицируемого для строк.
public static boolean permuteLexically(int[] data) {
int k = data.length - 2;
while (data[k] >= data[k + 1]) {
k--;
if (k < 0) {
return false;
}
}
int l = data.length - 1;
while (data[k] >= data[l]) {
l--;
}
swap(data, k, l);
int length = data.length - (k + 1);
for (int i = 0; i < length / 2; i++) {
swap(data, k + 1 + i, data.length - i - 1);
}
return true;
}
Пример использования
public static void main(String[] args) {
int[] data = { 1,2,3 };
do {
System.err.println(Arrays.toString(data));
} while(Util.permuteLexically(data));
}
Использование с [1,2,3] вы получаете
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]
с [1,1,3] вместо этого вы получаете
[1, 1, 3]
[1, 3, 1]
[3, 1, 1]
, что, как я думаю, вы просили.
Так как метод«переставляет» следующую перестановку в лексикографическом порядке, важно, чтобы элементы были упорядочены.Начиная с [3, 2, 1] вы больше не получите перестановок (сравните с примером выше).