我正在使用Apache Commons Lang3包类RandomStringUtils
。生成一些数字后,RandomStringUtils.randomNumeric
在无限循环中生成重复的数字。我怎样才能防止这种情况发生?
这是我的代码:
quantity = 100000
insertedNum = 0;
length = 9;
String[] numGen = new String[100];
idx = 1;
while (insertedNum < quantity) {
String random=RandomStringUtils.randomNumeric(length);
numGen[idx - 1] = random;
if (idx == 100) {
insertedNum += DB Code. If unique constraint error then discard batch return 0 else execute batch return inserted count.
idx = 1;
numGen = new String[100];
}
else
idx++;
}
}
答案 0 :(得分:0)
首先你有一个bug numGen [idx - 1] = random;
首次进入循环时,idx为0,因此您将分配给numGen中的-1字段。 2,它不会永远持续下去,但如果长时间运行,你可以在生成字符串时采取不同的方法,而不是删除整批,如果它们存在于当前批次中,则逐个重新生成它们。
如果此批次中尚未生成号码,请在每一代后尝试检查。您可以使用java map或set来标记批处理中所有看到的数字,以便查找更快。
因此,为您的解决方案添加代码,以便沿着这些方向查看:
quantity = 100000
insertedNum = 0;
length = 9;
String[] numGen = new String[100];
idx = 0;
Set<string> seenThisBatch = new HashSet<string>();
while (insertedNum < quantity) {
String random=RandomStringUtils.randomNumeric(length);
//in case of duplicates, keep on generating
while(seenThisBatch.contains(random){
random=RandomStringUtils.randomNumeric(length);
}
//add it to set
seenThisBatch.add(random);
numGen[idx - 1] = random;
if (idx == 100) {
//clear the batch set
seenThisBatch.clear();
insertedNum += DB Code. If unique constraint error then discard batch return 0 else execute batch return inserted count.
idx = 1;
numGen = new String[100];
}
else
idx++;
}
答案 1 :(得分:0)
一种繁琐的方法是保持重新生成随机字符串,直到您发现遇到了一个尚未包含在数组中的唯一随机字符串。您所要做的就是检查新生成的随机字符串是否已经在数组中
quantity = 100000
insertedNum = 0;
length = 9;
String[] numGen = new String[100];
idx = 0;
String random = "";
while (insertedNum < quantity) {
random=RandomStringUtils.randomNumeric(length);
while( isAlreadyInArray( numGen , random ) )
{
//regenerate a random string
random = RandomStringUtils.randomNumeric( length );
}
// Add it to your array, and increment it by one
numGen[idx] = random;
idx = (idx + 1) % numGen.length;
// In this case, the array got populated to completion
if (idx == 0) {
System.out.println( java.util.Arrays.toString( numGen ) );
//clear the batch set
insertedNum += DB Code. If unique constraint error then discard batch return 0 else execute batch return inserted count.
numGen = new String[100];
}
}
这里是辅助方法 isAlreadyInArray(String [] array,String someVal)
public boolean isAlreadyInArray( String[] mData , String strToCheck )
{
for( int x = 0; x < mData.length; x++ )
{
if( mData[x] != null && mData[x].equalsIgnoreCase( strToCheck ) )
{
return true;
}
}
return false;
}
请运行此示例,如果它无法提供帮助,那么我们当然可以重新解决问题:)