cod*_*ess 0 java random recursion
框架:Java
public static List<Integer> buttonIdList = new ArrayList();
public void myMainMethod() {
for(Integer i = 0; i < 11; i++) {
int randomButtonId = getUniqueIdNumber();
}
}
private static Integer getUniqueIdNumber() {
Random ran = new Random();
int randomButtonId = ran.nextInt(20) + 1;
if(buttonIdList.contains(randomButtonId)) {
getUniqueIdNumber();
} else {
buttonIdList.add(randomButtonId);
}
return randomButtonId;
}
Run Code Online (Sandbox Code Playgroud)
当代码遇到重复时,它会自动调用(递归),在第二次尝试时,如果数字是唯一的,则return语句将其返回给myMainMethod或getUniqueIdNUmber?
退货声明应该放在哪里?
您应该返回递归调用的结果:
private static Integer getUniqueIdNumber() {
Random ran = new Random();
int randomButtonId = ran.nextInt(20) + 1;
if(buttonIdList.contains(randomButtonId)) {
return getUniqueIdNumber();
} else {
buttonIdList.add(randomButtonId);
}
return randomButtonId;
}
Run Code Online (Sandbox Code Playgroud)
PS,这将是更好地使Random ran一个static而不是创建一个新的变量Random在每次递归调用实例.
private static Random ran = new Random();
private static Integer getUniqueIdNumber() {
int randomButtonId = ran.nextInt(20) + 1;
if(buttonIdList.contains(randomButtonId)) {
return getUniqueIdNumber();
} else {
buttonIdList.add(randomButtonId);
return randomButtonId;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以考虑更改buttonIdList为HashSet(或者LinkedHashSet如果您关心插入顺序),以便更有效地搜索现有数字.