使用 LinkedHashSet 存储随机数但有重复

Using a LinkedHashSet to store random numbers but has duplicates

我有一个生成随机算术表达式的应用程序。然后,它会在随机位置 (tag) 生成一个正确答案,并随后生成三个错误答案,供用户选择。

我最初使用 ArrayList 但它提供了重复项。然后我将 for loop 中的 ArrayList 内容转换为 Set 并且它仍然产生重复项。然后我将初始 ArrayList 更改为 LinkedHashSet ,唉,仍然重复。我在想这可能是我 for loop 中的位置,但我试过摆弄位置,但我要么遇到重复问题,要么遇到 Index 问题。

我不想使用 Java 8 的:List<String> deDupStringList3 = strList.stream().distinct().collect(Collectors.toList());,因为它是 API/Version 特定的。

For Loop代码:

    List<Integer> answers = new ArrayList<>(new HashSet<Integer>(5));
    answers.clear();

    int incorrectAnswer;

    for (int i = 0; i < 4; i++) {
            if (i == locCorrectAnswer) {
                answers.add(value);
            } else {
                if (operator == '+') {
                    incorrectAnswer = value + rand.nextInt(10) + 1;
                } else {
                    incorrectAnswer = value - rand.nextInt(10) + 1;
                }
                while (incorrectAnswer == value) {
                    if (operator == '+') {
                        incorrectAnswer = value + rand.nextInt(10) + 1;
                    } else {
                        incorrectAnswer = value - rand.nextInt(10) + 1;
                    }
                }
                answers.add(incorrectAnswer);
            }
    }

For Loop 代码(使用 ArrayList 并转换为 Set):

    ArrayList <Integer> answers;
    Set<Integer> s = new LinkedHashSet<>(answers);

    int incorrectAnswer;

    for (int i = 0; i < 4; i++) {
            if (i == locCorrectAnswer) {
                answers.add(value);
            } else {
                if (operator == '+') {
                    incorrectAnswer = value + rand.nextInt(10) + 1;
                } else {
                    incorrectAnswer = value - rand.nextInt(10) + 1;
                }
                while (incorrectAnswer == value) {
                    if (operator == '+') {
                        incorrectAnswer = value + rand.nextInt(10) + 1;
                    } else {
                        incorrectAnswer = value - rand.nextInt(10) + 1;
                    }
                }
                answers.add(incorrectAnswer);
            }
            s.addAll(answers);
            answers.clear();
            answers.addAll(s);
    }

我确定这是一个简单的错误,但我看不到它。

只需像这样创建您的答案集:

Set<String> answers = new LinkedHashSet<String>();

现在每个值只能存在 1 次。它可以添加而不会出现错误,但它只会在列表中出现一次。 你仍然可以iterate/loop通过它。

您仍在循环中调用 answers.addAll(s)。虽然在任何给定的迭代中 s 中不会有任何重复项,但您仍然会从不同的迭代中获得重复项。

因为您不想要任何重复项,所以首先没有理由使用 Lists。 Set 将删除重复项,LinkedHashSet 将保留插入顺序。

您也可以尝试以下方法。

Set<Integer> s = new HashSet<>();
//correct value
s.add(value);
while (s.size() < 4)
{
    //incorrect value
    s.add( value + rand.nextInt(10) + 1);
}
List<Integer> answers = new ArrayList<>(s);
//shuffle
Collections.shuffle(answers);