【问题标题】:Java loop through all stringsJava循环遍历所有字符串
【发布时间】:2023-03-31 09:24:02
【问题描述】:

我想制作一个程序,对长度小于我要指定的数字的所有字符串执行某些操作。我想要这样的东西:

for(int char1 = 32; char1 <= 126; char1++){
  for(int char2 = 32; char2 <= 126; char2++){
    char[] chars = new char[2];
    char[0] = (char)char1; char[1] = (char)char2;
    String s = String.valueOf(chars);
    doStuffWith(s);
  }
}

当然还有可选择数量的字符。这可能吗?

它不是用于暴力破解密码,而是用于浏览服务器上的文件。

【问题讨论】:

  • 我很困惑:它打算做什么“某事”?
  • 这可能是关于生成密码暴力破解的单词列表。
  • 最简单的解决方案是使用递归。
  • 顺便说一句,我在密码中使用了非 ASCII 字符 ;)
  • 只有您的想象力才能设定界限 :) 但现在说实话和认真,如果您能多解释一下您想要做什么,我们可能会提供帮助。

标签: java string for-loop


【解决方案1】:

这个怎么样?非递归解决方案。

int min = 32;
int max = 127;
int numChars = 6; //Set to whatever value you like.
int numDifferentChars = max - min;
int numPossibilities = (int)Math.pow(max - min,numChars);
for(int i = 0;i < numPossibilities;i++) {
    char[] chars = new char[numChars];
    for(int j = 0;j < numChars;j++) {
        int chr = i;
        for(int k = 0;k < j;k++) {
            chr /= numDifferentChars;
        }
        chars[j] = (char)((chr % numDifferentChars) + min);
    }
    doStuffWith(String.valueOf(chars));
}

我猜它可以提高效率,但这似乎有效,除非 numPossibilities 有整数溢出。

编辑:此代码有效。我测试过了!

【讨论】:

  • 我想你的意思是chars[j] = (char)(chr % (max - min + 1) + min);
  • 我确实做到了。好吧,几乎,我将代码中的“最大值”更改为 127,以防止所有这些 +1 无处不在。
  • + min) 必须在括号内。
  • numDifferentChars = max - min + 1max = 126 因为 127 是一个删除字符。
【解决方案2】:

这比较使用循环和递归。我一般不喜欢 Java 中的递归,但在这种情况下,它更干净、更快。

private static volatile int dontOptimiseAway;

public static void main(String[] args) throws IOException, ClassNotFoundException {
    for (int i = 1; i <= 6; i++) {
        long comb = testCombinations(i, 'a', 'z');
        long iter = testIteration(i, 'a', 'z');
        System.out.printf("%d: Comb: %.3f secs, loops: %.3f%n", i, comb / 1e9, iter / 1e9);
    }
}

private static long testCombinations(int maxLetters, char min, char max) {
    long start = System.nanoTime();
    for (int i = 1; i <= maxLetters; i++)
        combinations(i, min, max);
    return System.nanoTime() - start;
}

public static void combinations(int length, char min, char max) {
    combinations0(new char[length], 0, min, max);
}

private static void combinations0(char[] chars, int i, char min, char max) {
    if (i >= chars.length) {
        doStuff(chars);
    } else {
        for (char ch = min; ch <= max; ch++) {
            chars[i] = ch;
            combinations0(chars, i + 1, min, max);
        }
    }

}

private static void doStuff(char[] chars) {
    dontOptimiseAway = chars.length;
}

private static long testIteration(int maxLetters, char min, char max) {
    long start = System.nanoTime();
    for (int i = 1; i <= maxLetters; i++)
        loops(i, min, max);
    return System.nanoTime() - start;
}

public static void loops(int length, char min, char max) {
    int numDifferentChars = max - min + 1;
    long numPossibilities = (long) Math.pow(numDifferentChars, length);
    char[] chars = new char[length];
    for (long i = 0; i < numPossibilities; i++) {
        long chr = i;
        for (int j = 0; j < length; j++) {
            chars[j] = (char) (chr % numDifferentChars + min);
            chr /= numDifferentChars;
        }
        doStuff(chars);
    }
}

打印

1: Comb: 0.000 secs, loops: 0.000
2: Comb: 0.000 secs, loops: 0.000
3: Comb: 0.003 secs, loops: 0.004
4: Comb: 0.006 secs, loops: 0.025
5: Comb: 0.116 secs, loops: 0.793
6: Comb: 3.856 secs, loops: 25.101

【讨论】:

    猜你喜欢
    • 2015-06-18
    • 2014-02-28
    • 2019-08-10
    • 2014-09-19
    • 2023-03-23
    • 2016-01-24
    • 2020-02-16
    • 1970-01-01
    相关资源
    最近更新 更多