Java-检查ArrayList是否存在重复项
我正在生成4个字符的pin码,供孩子们在学校使用。PIN必须作为4个字符串存储在数据库中。这是我用来生成管脚的方法:Java-检查ArrayList是否存在重复项,java,arraylist,duplicates,Java,Arraylist,Duplicates,我正在生成4个字符的pin码,供孩子们在学校使用。PIN必须作为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
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);
}
}
public void generatePin(){
弦销;
随机r=新随机();
对于(int i=0;i
我的问题是:
如果我稍微改变上面的方法,将每个pin添加到字符串类型的ArrayList中,那么什么是最有效的方法来“搜索”该列表,并确保一所学校的两名学生不会使用相同的pin
(注:每所学校的学生人数不得超过1200人)
编辑:
我最后做了以下几件事:
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--;
}
}
}
public void generatePin(){
List pins=new ArrayList();
弦销;
随机r=新随机();
对于(int i=0;i
创建ArrayList以存储管脚,并在每次生成后检查该管脚是否存在于ArrayList中。如果没有,则将其分配给学生。如果是,则减小循环计数器,以便返回列表中刚刚引用的索引并生成新的管脚。这将继续进行,直到生成唯一的pin,并将其分配给学生。使用集合,因为它不允许重复,以记住并检查使用过的pin。我将用于生成代码的代码移动到一个单独的方法中
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);
}
}
public void generatePin(){
弦销;
Set generatedPins=new HashSet();
对于(int i=0;i
首先,我会生成管脚,然后为每个学生设置管脚。使用Set和SecureRandom并使用强大的算法(我想引脚是敏感数据…)。比如:
int studentsNumber=4;
//安全地生成N个唯一的管脚
Set pins=newhashset();
SecureRandom sr=SecureRandom.getInstance(“SHA1PRNG”);
while(pins.size()!=学生人数){
int pin=sr.nextInt((3998-1)+1)+1;
字符串pinStr=String.format(“%04d”,pin);
pins.add(pinStr);
}
//给学生钉上别针
对于(学生s:createdStudents){
用于(字符串引脚:引脚){
s、 设置pin(pin);
}
}
pin生成代码(无更改):
公共字符串generatePin(){
弦销;
随机r=新随机();
int rand=r.nextInt((3998-1)+1)+1;
如果(兰特<10){
pin=“000”+兰特;
}否则如果(兰特<100){
pin=“00”+兰特;
}否则,如果(兰特<1000){
pin=“0”+兰特;
}否则{
pin=”“+兰德;
}
回位销;
}
确保分布式管脚是唯一的:
public void distributeUniquePins() {
List<String> distributedPins = new ArrayList<>();
createdStudents.forEach(student -> {
String pin = generatePin();
while(distributedPins.contains(pin)) {
pin = generatePin();
}
distributedPins.add(pin);
student.setPin(pin);
});
}
public void distributeUniquePins(){
List distributedPins=new ArrayList();
createdStudents.forEach(学生->{
字符串pin=generatePin();
while(distributedPins.contains(pin)){
pin=generatePin();
}
分配pin。添加(pin);
学生。设置pin(pin);
});
}
如果(!list.contains(pin))list.add(pin)代码>您可能希望简化用于添加前导零的代码。检查。当你不想在你的收藏中重复使用集合,因为它不允许重复,那么这是正确的方法。我希望我不会误解你的评论,但是的,我使用集合的原因是因为它不允许重复。事实上,我建议解释为什么使用集合而不是列表;我看到您添加了“因为它不允许重复”,然后我认为现在答案已经解释清楚了:)SecureRandom
在这种情况下可能有点过火,您不认为吗?如果性能不好,请切换到Random。。。
public String generatePin() {
String pin;
Random r = new Random();
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;
}
return pin;
}
public void distributeUniquePins() {
List<String> distributedPins = new ArrayList<>();
createdStudents.forEach(student -> {
String pin = generatePin();
while(distributedPins.contains(pin)) {
pin = generatePin();
}
distributedPins.add(pin);
student.setPin(pin);
});
}