【问题标题】:Validating against duplicate user entries when using sets使用集合时验证重复的用户条目
【发布时间】:2014-12-07 05:28:34
【问题描述】:

我目前正在学习 Java,到目前为止一直在使用普通数组。下学期我们将使用 ArrayList 等数据结构,但我决定提前阅读。我已经读过,对于存储不能重复的数据,Sets 是首选的数据结构,但是在下面的代码中,用户仍然可以输入重复的条目吗?任何人都可以向我解释这个过程,也许可以解决我的问题吗?

public class Lotto {

private static final int INPUT_SIZE = 6;

private static final int MIN_NUMBER_POSSIBLE = 0;

private static final int MAX_NUMBER_POSSIBLE = 25;

private Set<Integer> userNumbers = new HashSet<Integer>();

private Set<Integer> randomNumbers = new HashSet<Integer>();

public static void main(String[] args) {
    Lotto c = new Lotto();
    c.generateRandomNumbers();
    System.out.println("Pick " + INPUT_SIZE + " numbers from "
            + MIN_NUMBER_POSSIBLE + " to " + MAX_NUMBER_POSSIBLE + ".");
    c.readUserNumbers();
    if (c.doUserNumbersMatchRandomNumbers()) {
        System.out.println("You win :) !");
    } else {
        System.out.println("Sorry you failed :( !");
        c.showRandomNumbersToUser();
    }
}

private void generateRandomNumbers() {
    Random random = new Random();
    for (int i = 0; i < INPUT_SIZE; i++) {
        randomNumbers.add(random.nextInt(MAX_NUMBER_POSSIBLE));
    }
}

private void showRandomNumbersToUser() {
    System.out.println("\nRandom numbers where : ");
    for (Integer randomNumber : randomNumbers) {
        System.out.println(randomNumber + "\t");
    }
}

private void readUserNumbers() {
    Scanner input = new Scanner(System.in);
    int inputSize = 1;
    while (input.hasNextInt() && inputSize < INPUT_SIZE) {
        int numberChoosen = input.nextInt();
        if (numberChoosen < MIN_NUMBER_POSSIBLE
                || numberChoosen > MAX_NUMBER_POSSIBLE) {
            System.out.println("Your number must be in "
                    + MIN_NUMBER_POSSIBLE + " - " + MAX_NUMBER_POSSIBLE
                    + " range.");
        } else {
            userNumbers.add(numberChoosen);
            inputSize++;
        }
    }
}

private boolean doUserNumbersMatchRandomNumbers() {
    for (Integer userNumber : userNumbers) {
        if (!randomNumbers.contains(userNumber)) {
            return false;
        }
        printMatchingNumber(userNumber);
    }
    return true;
}

private void printMatchingNumber(int num) {
    System.out.println("Your number, " + num + ", has been called.");
}

}

【问题讨论】:

  • 您预计会发生什么,而会发生什么?你读过 Set 的 javadoc 吗?
  • 我认为如果我尝试存储重复的号码会引发异常。我想避免用户在 HashSet 中输入存储重复项。
  • 好的。所以你还没有阅读javadoc。阅读。这是了解类/方法作用的最佳方式:docs.oracle.com/javase/7/docs/api/java/util/Set.html#add%28E%29。 如果该集合已经包含该元素,则调用将保持该集合不变并返回 false。 看到了吗?没有抛出异常。

标签: java arrays set duplicates hashset


【解决方案1】:

集合不禁止多次输入唯一值。您需要检查前提条件,例如 Set.add。

所以不要只是调用:

userNumbers.add(numberChoosen);

试试

if (!userNumbers.contains(numberChoosen)) {
    userNumbers.add(numberChoosen);
} else {
    // do stuff...
}

【讨论】:

    【解决方案2】:

    Set#add(Object) 在对象添加成功时返回true,否则返回false。它不会抛出异常,所以你需要添加一个条件来检查操作是否成功:

    if (userNumbers.add(numberChoosen)) {
        System.out.println("Number added successfully");
    } else {
        System.out.println("Duplicate number detected");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多