【问题标题】:Using a LinkedHashSet to store random numbers but has duplicates使用 LinkedHashSet 存储随机数但有重复
【发布时间】:2018-06-27 08:14:34
【问题描述】:

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

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

我不想使用 Java 8's: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);
    }

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

【问题讨论】:

  • 您应该遵循的一般模式是循环迭代并生成不正确的答案,将它们添加到 集合,直到集合有 3 个不正确的答案。
  • 现在反对的是什么?
  • @TimBiegeleisen 我希望正确答案和错误答案出现在随机位置。这仍然适用于这种方法吗?

标签: java android arraylist set linkedhashset


【解决方案1】:

您也可以尝试以下方法。

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

【讨论】:

  • 我使用了你的答案,但省略了shuffle 并用LinkedHashSet 实现了它,谢谢。
【解决方案2】:

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

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

现在每个值只能出现 1 次。可以添加它而不会出错,但它只会在列表中出现一次。 你仍然可以迭代/循环它。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-16
      • 2021-03-22
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      • 2021-08-15
      • 2020-05-18
      • 1970-01-01
      相关资源
      最近更新 更多