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