我的目标是生成固定长度的迭代字母/数字字符串,例如:
aaaaaa
aaaaab
aaaaac
...
aaaaa9
aaaaba
...
999999
它可以很容易地用嵌套的for循环实现,如下代码:
public static void main(String[] strings) {
Object[] array = new Object[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
'y', 'z', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
List<String> list = Lists.newArrayList();
int a, b, c, d, e, f;
for (a = 0; a < 35; a++) {
for (b = 0; b < 35; b++) {
for (c = 0; c < 35; c++) {
for (d = 0; d < 35; d++) {
for (e = 0; e < 35; e++) {
for (f = 0; f < 35; f++) {
list.add("" + array[a] + array[b] + array[c] + array[d] + array[e] + array[f]);
}
}
}
}
}
}
}
但最好知道如何重构它,例如有可能在多线程中运行此类代码,或者甚至已经存在一些库以生成此类数字。
如有任何帮助,我们将不胜感激。
最佳答案
您正在生成 35^6=1838265625 个值;因此您可以使用单个 for 循环重写它:
for (int i = 0; i < 1838265625; ++i) {
int ii = i;
int f = ii % 35; ii /= 35;
int e = ii % 35; ii /= 35;
int d = ii % 35; ii /= 35;
// ...
int a = ii % 35;
list.add("" + array[a] + array[b] + array[c] + array[d] + array[e] + array[f]);
}
因此,要在多个线程中重写,只需在线程之间划分 [0..1838265625)
范围,这样每个线程都会针对该范围的一部分运行 for 循环,例如线程 1 执行 [0..1_000_000)
,线程 2 执行 [1_000_000..2_000_000)
等
您可能会发现使用 ForkJoinPool
更容易管理范围的拆分和合并,而不是尝试手动完成。
当然,我仍然在考虑 Java 8 之前的术语。您也可以使用流来执行此操作(如 GhostCat 所建议的那样):
IntStream.range(0, 1838265625).parallelStream()
.map(i -> {
int ii = i;
int f = ii % 35; ii /= 35;
int e = ii % 35; ii /= 35;
int d = ii % 35; ii /= 35;
// ...
int a = ii % 35;
return "" + array[a] + array[b] + array[c] + array[d] + array[e] + array[f]; })
.collect(someCollector);
关于java - 生成固定长度的字母/数字字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40124212/