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

时间:2018-06-27 08:14:34

标签: java android arraylist set linkedhashset

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

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

我不想使用IndexJava 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

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

3 个答案:

答案 0 :(得分:1)

只需创建以下答案集即可:

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

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

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

答案 2 :(得分:0)

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

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