tes*_*ter 2 java arraylist duplicates
我正在为孩子们在学校生成4个字符的密码.引脚必须在数据库中存储为4个字符串.这是我用来生成引脚的方法:
public void generatePin() {
String pin;
Random r = new Random();
for (int i = 0; i < createdStudents.size(); i++) {
int rand = r.nextInt((3998 - 1) + 1) + 1;
if (rand < 10) {
pin = "000" + rand;
} else if (rand < 100) {
pin = "00" + rand;
} else if (rand < 1000) {
pin = "0" + rand;
} else {
pin = "" + rand;
}
createdStudents.get(i).setPin(pin);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
如果我略微改变上面的方法,在我去的时候将每个引脚添加到String类型的ArrayList中,"搜索"该列表的最有效方法是什么,并确保一所学校的2名学生不会最终得到相同的针脚?
(注意:每所学校永远不会有超过1,200名学生)
编辑:
我最后做了以下事情:
public void generatePin() {
List<String> pins = new ArrayList<String>();
String pin;
Random r = new Random();
for (int i = 0; i < createdStudents.size(); i++) {
int rand = r.nextInt((9999 - 1) + 1) + 1;
if (rand < 10) {
pin = "000" + rand;
} else if (rand < 100) {
pin = "00" + rand;
} else if (rand < 1000) {
pin = "0" + rand;
} else {
pin = "" + rand;
}
if (!pins.contains(pin)) {
createdStudents.get(i).setPin(pin);
pins.add(pin);
} else {
i--;
}
}
}
Run Code Online (Sandbox Code Playgroud)
创建一个ArrayList来存储引脚,检查每一代后引脚是否存在于ArrayList中.如果没有,请将其分配给学生.如果是,则递减循环计数器以返回列表中刚引用的索引并生成新引脚.这将继续,直到生成一个唯一的引脚,它将被分配给学生.
使用Set,因为它不允许重复,记住并检查使用过的引脚.我将用于生成代码的代码移动到单独的方法中
public void generatePin() {
String pin;
Set<String> generatedPins = new HashSet<>();
for (int i = 0; i < createdStudents.size(); i++) {
do {
pin = generatePinCode();
} while (!generatedPins.add(pin));
createdStudents.get(i).setPin(pin);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
362 次 |
| 最近记录: |