Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-检查ArrayList是否存在重复项_Java_Arraylist_Duplicates - Fatal编程技术网

Java-检查ArrayList是否存在重复项

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

我正在生成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 (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);
    });
}