java - 生成固定长度的字母/数字字符串

标签 java

我的目标是生成固定长度的迭代字母/数字字符串,例如:

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/

相关文章:

java - 在 Java 中验证 SSH 主机 key 格式

在 mysql 中运行的字符串上的 Java SQLException

java - selenium动态点击li项

java - jUnit 测试精神

java - Android 滑动选项卡崩溃 ( logcat : Can't convert to color: type=0x1 )

java - 必须在方法中指定返回,但我希望方法再次调用自身而不是返回

java - ResultSet 未填充结果

java - Prevayler 序列化优化

java - 日历 set() 方法没有设置正确的时间

Java:将两个输入的整数加2