我需要能够创建一个函数,该函数生成一个选定数量的字符串,其中添加了随机生成的正数,这些正数基于字符串掩码。
字符串掩码的示例,其中[n#]表示具有特定位数的正数:
generateStrings(2, "( (-[n2]) + [n5] ) / [n1]");
第一个数字告诉函数要生成多少个字符串。
2个生成的字符串:
((-23)+ 47269)/ 9
((-12)+ 17935)/ 1
我希望能够生成数字范围从1位到10位的字符串。
编辑:这是一个可以生成数字范围从1到10的数字的函数:
public static int generateNumber(int n) {
int m;
if (n==1){
m = (0 + (int)(Math.random() * ((9 - 0) + 1)));
} else if (n==2) {
m = (10 + (int)(Math.random() * ((99 - 10) + 1)));
} else if (n==3) {
m = (100 + (int)(Math.random() * ((999 - 100) + 1)));
} else if (n==4) {
m = (1000 + (int)(Math.random() * ((9999 - 1000) + 1)));
} else if (n==5) {
m = (10000 + (int)(Math.random() * ((99999 - 10000) + 1)));
} else if (n==6) {
m = (100000 + (int)(Math.random() * ((999999 - 100000) + 1)));
} else if (n==7) {
m = (1000000 + (int)(Math.random() * ((9999999 - 1000000) + 1)));
} else if (n==8) {
m = (10000000 + (int)(Math.random() * ((99999999 - 10000000) + 1)));
} else if (n==9) {
m = (100000000 + (int)(Math.random() * ((999999999 - 100000000) + 1)));
} else if (n==10) {
m = (1000000000 + (int)(Math.random() * ((2147483647 - 1000000000) + 1)));
}
return m;
}
现在我只需要能够将该函数应用于字符串掩码。
EDIT3:这是一个脚本,它应该生成一个带有上述格式的字符串掩码的字符串:
public static String generateString(String mask) {
for (int i = 1; i < 10; i++)
{
String searchString = "[n" + i + "]";
int lastIndex = 0;
int count = 0;
while(lastIndex != -1){
lastIndex = mask.indexOf(searchString,lastIndex);
if( lastIndex != -1){
count ++;
lastIndex+=searchString.length();
}
}
for (int j=count; j > 0;) {
while(lastIndex != -1){
lastIndex = mask.indexOf(searchString,lastIndex);
if( lastIndex != -1){
count ++;
lastIndex+=searchString.length();
}
}
mask = mask.replaceFirst(searchString, String.valueOf(generateNumber(i)));
}
}
return mask;
}
我不知道这个脚本是否有用,而且我不知道如何测试我的代码,所以如果有人会验证它是否有效,我将不胜感激。 这段代码的一部分来自ansible的答案,另一部分来自codebreach对这个问题的回答:Occurrences of substring in a string我只想对他们所做的工作给予赞扬。
答案 0 :(得分:1)
如果您想从头开始学习Java,首先要生成random int,转换此int to a String。字符串可用于build您想要的输出。
但是如果你很懒,只想写一行代码就可以使用RandomStringUtils from the apache commons library。但是,假设您知道如何在类路径中添加外部库。
String out = RandomStringUtils.randomNumeric(n);
答案 1 :(得分:0)
一个建议是看看你的if / else块是如何重复的?我们可以使用power函数来简洁。
public static int generateNumber(int n) {
int lowerBound = (int) Math.pow(10,num-1);
int upperBound = (int) Math.pow(10,num) - 1;
int random = lowerBound + (int)(Math.random() * ((upperBound - lowerBound) + 1 ));
return random;
}
现在,您可能希望在我的信件中搜索字符串字母,以查找[
。
然后,当您逐行阅读时,创建一个新字符串,但一旦到达[
,您将需要执行其他操作,直到找到相应的]
括号。当你找到其中一个时,你会怎么做?
一旦你能做到这一点,那么你可以多次这样做,具体取决于传入的内容。
如果您有具体问题,请发布您遇到的问题。
更新: 是的,看到这是一个更好的问题。而不仅仅是要求某人解决问题,你会想出一个解决方案并在遇到问题时提出问题。
此问题的解决方案类似于随机数函数的问题。您明确列出了所有可能性,而不是使用变量和循环来为您完成。
这个怎么样?
for (int i = 1; i < 10; i++)
{
String searchString = "[n" + i + "]";
mask = mask.replaceFirst(searchString, String.valueOf(generateNumber(i)));
}
现在这将只替换每个字符串的第一个实例,我们希望在掩码上保持LOOPING以查找每个字符串的所有实例。你怎么样?
编辑2:
好的一些事情。 replaceAll接受一个正则表达式,所以括号搞乱了(至少对我而言)。我通过首先搜索“n1”,“n2”,然后删除所有括号来解决这个问题。
第二,你在第二个for循环中的while循环没有做任何事情。我猜一个复制/粘贴错误?
第三,我们可以将.replaceFirst移动到while循环中。把它们放在一起看起来像这样。
public static String generateString(String mask) {
for (int i = 1; i < 10; i++)
{
String searchString = "n" + i;
int lastIndex = 0;
while(lastIndex != -1){
lastIndex = mask.indexOf(searchString,lastIndex);
if( lastIndex != -1){
mask = mask.replaceFirst(searchString, String.valueOf(generateNumber(i)));
}
}
}
mask = mask.replaceAll("\\[", "").replaceAll("\\]","");
return mask;
}
所以基本上你有什么,但是为了可读性做了一些修改并修复了正则表达式问题。
这对我有用。你现在唯一需要做的就是把它包装成一个循环,这样输出你想要的字符串数。
有一点需要注意的是,我们正在做的事情是非常低效的。每次我们运行.replaceAll
或replaceFirst
时,我们都可以循环遍历整个字符串。我们这样做至少11次。这可以通过单个传递字符串来完成,查找[nX]
,并用随机数替换它们。我建议你试一试。