по алгоритму тасования Фишера-Йейтса
Fisher-Yates shuffle - стандартный алгоритм тасования. Вот псевдокод:
To shuffle an array a of n elements:
for i from n - 1 downto 0 do
j ← random integer with 0 ≤ j ≤ i
exchange a[j] and a[i]
Вот простая реализация Java:
static String shuffled(String s) {
char[] a = s.toCharArray();
final int N = a.length;
Random r = new Random();
for (int i = N - 1; i >= 0; i--) {
int j = r.nextInt(i + 1);
swap(a, i, j);
}
return new String(a);
}
static void swap(char[] a, int i, int j) {
char t = a[i];
a[i] = a[j];
a[j] = t;
}
Тогда вы можете иметь:
String text = "stackoverflow";
for (int i = 0; i < 10; i++) {
System.out.println(shuffled(text));
}
Это приведет к 10 тасованиям строки "stackoverflow"
( см. Также на ideone.com ).
Альтернативное решение Guava + Java Collections Framework
Если у вас установлена библиотека Guava , то это было бы хорошим решением. Вот ключевые факты:
Затем мы можем объединить эти два кода, чтобы получить следующий чистый и читаемый код:
import com.google.common.primitives.*;
import java.util.*;
public class AnagramCreator {
public static void main(String[] args) {
String text = "stackoverflow";
char[] arr = text.toCharArray();
List<Character> list = Chars.asList(arr);
for (int i = 0; i < 10; i++) {
Collections.shuffle(list);
System.out.println(new String(arr));
}
}
}
Выше будет напечатано 10 анаграмм "stackoverflow"
.
Обратите внимание, что Гуава используется только для обеспечения List<Character>
просмотра в реальном времени из char[]
. char[]
не получает автоматическую коробку с Character[]
(и наоборот), в противном случае Arrays.asList(T...)
было бы достаточно.
Смотри также
Похожие вопросы