Java - 检查ArrayList是否重复

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中.如果没有,请将其分配给学生.如果是,则递减循环计数器以返回列表中刚引用的索引并生成新引脚.这将继续,直到生成一个唯一的引脚,它将被分配给学生.

Joa*_*son 7

使用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)

  • 确切地说,我建议解释为什么要使用Set而不是List; 我看到你添加"因为它不允许重复",那么我认为现在答案很好解释了:) (2认同)