Использование LinkedHashSet для хранения случайных чисел, но с дубликатами - PullRequest
0 голосов
/ 27 июня 2018

У меня есть приложение, которое генерирует случайное арифметическое выражение. Затем он генерирует правильный ответ в случайной позиции (tag) и три последующих неправильных ответа, позволяющих пользователю выбирать.

Изначально я использовал ArrayList, но он дает дубликаты. Затем я преобразовал содержимое ArrayList в for loop в 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);
    }

Я уверен, что это простая ошибка, но я ее не вижу.

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

Вы все еще звоните answers.addAll(s) в цикле. Хотя в s не будет дубликатов на любой итерации, вы все равно получите дубликаты на разных итерациях.

Поскольку вам не нужны дубликаты, нет никаких оснований использовать List s в первую очередь. Любой Set удалит дубликаты, а LinkedHashSet сохранит порядок вставки.

0 голосов
/ 27 июня 2018

Вы также можете попробовать следующее.

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);
0 голосов
/ 27 июня 2018

Просто создайте свой набор ответов, как это:

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

Теперь каждое значение может быть там только 1 раз. Это может быть добавлено без получения ошибки, но это будет только один раз в списке. И вы все еще можете перебирать / перебирать его.

...