最近需要一个排列和随机的需求,就自己写了一个简单的。在这里备份下:
CONTENTS
排列:
static long idx = 1;
public static void printArrange(String arr[], Set<Integer> skip, String before)
{
for (int i = 0; i < arr.length; i++)
{
if (skip.contains(i))
{
continue;
}
skip.add(i);
printArrange(arr, skip, before + arr[i] + "->");
skip.remove(i);
}
if (skip.size() == arr.length)
{
System.out.print("" + idx++ +"\t\t\t");
System.out.println(before);
}
}
调用方式:
String arr2[] = new String[]{"A","B","C","D"};
printArrange(arr, new HashSet<Integer>(), "");
随机数:
public static void printRandom(String arr[], int times)
{
Random random = new Random();
int size = arr.length;
//包含之前已经打印过的序列。
Set<String> before = new HashSet<String>();
for (int j = 0; j < times; j++)
{
int idx = 0;
Set<Integer> skip = new HashSet<Integer>();
//当前序列的key值,用来检测是否已经打印过。
StringBuilder sb = new StringBuilder();
//需要打印的序列
StringBuilder str = new StringBuilder();
for (int i = 0; i < size; i++)
{
do
{
idx = random.nextInt(size);
}
while (skip.contains(idx));
skip.add(idx);
sb.append(idx);
str.append(arr[idx] + "->");
}
if (!before.contains(sb.toString()))
{
System.out.println(str.toString());
before.add(sb.toString());
}
}
}
调用方式:
String arr[] = new String[]{"A","B","C","D"};
printRandom(arr, 100);
备注:
1)代码的实现写得比较简单,只是一个简单的思路,后续可以根据特定需求进行修改。
发表评论