Java-检查ArrayList是否重复

时间:2018-08-24 08:07:28

标签: 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);
    }
}

我的问题是:

如果我略微改变了上述方法,将每个引脚添加到String类型的ArrayList中,那么“搜索”该列表并确保一所学校中的2名学生不这样做的最有效方法是什么最终使用相同的图钉?

(注意:每所学校的学生人数不得超过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--;
        }
    }
}

创建一个ArrayList来存储引脚,并在每次生成后检查引脚是否存在于ArrayList中。如果不是,则将其分配给学生。如果是这样,请递减循环计数器,以返回到列表中刚引用的索引并生成一个新的引脚。这将一直持续到生成唯一的图钉并将其分配给学生为止。

3 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

首先,我将生成图钉,然后将其设置给每个学生。通过强大的算法使用Set和SecureRandom(我想引脚是敏感数据...)。喜欢:

    int studentsNumber = 4;

    // Securely generate N unique pins
    Set<String> pins = new HashSet();
    SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
    while (pins.size() != studentsNumber) {
        int pin = sr.nextInt((3998 - 1) + 1) + 1;
        String pinStr = String.format("%04d", pin);
        pins.add(pinStr);
    }

    // Set pins to the students
    for (Student s : createdStudents) {
        for (String pin : pins) {
            s.setPin(pin);
        }
    }

答案 2 :(得分:0)

用于引脚生成的代码(不变):

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);
    });
}