使用 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
中不会有任何重复项,但您仍然会从不同的迭代中获得重复项。
因为您不想要任何重复项,所以首先没有理由使用 List
s。 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);
我有一个生成随机算术表达式的应用程序。然后,它会在随机位置 (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
中不会有任何重复项,但您仍然会从不同的迭代中获得重复项。
因为您不想要任何重复项,所以首先没有理由使用 List
s。 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);