Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 生成所有可能的字符串优化_Java_String_Loops_Random_While Loop - Fatal编程技术网

Java 生成所有可能的字符串优化

Java 生成所有可能的字符串优化,java,string,loops,random,while-loop,Java,String,Loops,Random,While Loop,我必须生成每个可能字符串的列表(给定一个从中提取字符的特定字符串),我想到的第一个方法是: public String getRandomLetters(Integer size, String range){ String word = ""; Random r = new Random(); for (int i = 0; i < size; i++) { word += range.charAt(r.nextInt(range.length(

我必须生成每个可能字符串的列表(给定一个从中提取字符的特定字符串),我想到的第一个方法是:

public String getRandomLetters(Integer size, String range){
    String word = "";
    Random r = new Random();

    for (int i = 0; i < size; i++) {
        word += range.charAt(r.nextInt(range.length()));
    } 

    return word;
}
要运行此操作,请执行以下操作:

        List<String> testList = getListOfRandomWords(20);

        for (String block : testList) {
            System.out.println(block);
        }
输出正常且方法工作正常,我唯一关心的是
而(randomLetters.contains(randomLetter))
,这是检查重复值的最佳方法吗?

PD:我不能用求和来简化这个过程并按顺序生成字符串,它们必须按随机顺序出现

使用
List words=new ArrayList()
words.contains(word)
绝对不是检查重复值的最佳方法。这是一个O(N²)操作,因为您对每个单词都有一个O(N)搜索,并且您对添加的每个单词循环一次或多次

Set words=newhashset()
单词。包含(单词)
的速度应明显加快

当然,如果您想保持添加单词的顺序,而不是一些随机顺序,您应该使用:
Set words=new LinkedHashSet()


使用
returnnewarraylist(words)
将返回的值转换回
列表
我发现循环所有排列的最佳方法是


我不完全理解它,因为我还没有读过它背后的证据,但它确实有效,并且在所有排列中循环一次。使用随机置换生成器永远不能保证生成所有置换。

随机和唯一不能同时满足。假设你们需要所有排列的随机顺序

若字符串的长度相对较小(所以结果列表适合内存),则可以先生成所有置换,然后再生成洗牌结果。这将提供相当不错的性能,因为这两种操作在输出大小上都是线性的

要获得代码并合并

若您一次只需要一个随机唯一的结果,那个么生成随机字符串的原始代码是可以的,但您应该使用Hashset或类似的结构来查找重复项()

请注意,以这种方式生成所有组合是不实际的-在大约80%的组合后,重试次数将增长得更大,并且到最后将接近所有组合的次数

或者,您可以直接将随机数转换为字符串:

  • 生成从1到(numberOfCharacters^LengthOfString)的随机数
  • 检查Hashset中是否有重复项-返回1
  • 将数字添加到Hashset
  • 将数字转换为字符串(除以numberOfCharacters,直到达到0,并在每个步骤上使用提示选择字符)
    19代表“abc”:
    19/3=6,提示1-在结果中添加“b” 6/3=2,提示0-在结果中添加“a” 2-在result=“bac”中添加“c”

  • 真的有必要随机生成字符串吗?如果你系统地生成所有可能的字符串会容易得多。你想阅读如何进行排列。在那里使用random肯定会使代码更复杂(更慢)。。。而且不会增加任何价值。有
    Collections.shuffle()
    可供您使用,这样做可能会容易得多。听起来您根本不想要随机性。如果你真的想要每一个可能的组合,那么只需要迭代所有的组合和排列。随机性与此无关。@Henry是的。。。这是一个要求:P
            List<String> testList = getListOfRandomWords(20);
    
            for (String block : testList) {
                System.out.println(block);
            }
    
    c
    b
    a
    cc
    ca
    aa
    bb
    ba
    ac
    bc
    ab
    cb
    bcc
    cca
    bac
    aab
    bab
    cbb
    baa
    bcb