Метод get HashMap выглядит так, как будто он возвращает копию, верно? - PullRequest
1 голос
/ 07 января 2020

У меня есть программа, которая читает слово за словом текстовый файл. Каждое слово проверяется на наличие метки в форме "", "" или чего-то подобного. Если метка найдена, она заменяет эту метку случайным словом из ArrayList, соответствующим его метке, используя следующий метод:

private String getSubstitute(String label) {
        if (listMap.get(label) != null){
            String substitute = randomFrom(listMap.get(label));
            listMap.get(label).remove(substitute);
            return randomFrom(listMap.get(label));
        }
        if (label.equals("number")){
            return " " + myRandom.nextInt(50) + 5;
        }
    return "**UNKNOWN**";
}

Это работает довольно хорошо, за исключением того, что при каждом использовании слов он должен быть удаленным из соответствующего списка, чтобы его нельзя было использовать повторно. Я пытаюсь сделать это в 4-й строке кода выше. HashMap listMap<String, ArrayList> является переменной экземпляра, поэтому у меня сложилось впечатление, что когда я вызываю listMap.get(label).remove(substitute), я получаю прямой доступ к ArrayList, содержащемуся в listMap, и удаляю его. Однако, когда я запускаю код, иногда я вижу повторения слов, которые были ранее использованы. Что мне здесь не хватает?

Для забавного примера вот что было напечатано в одном случае:

Это скользкая история о том, как синий тигр стал синим тигром , Однажды, около 295 десятилетий, по земле бродили разгневанные, злые ящеры. Один из них был назван Джермейн. Этот панголин был один в мире. Затем он стал оранжевым ящером, живущим в Эквадоре. Это животное любило думать и сдаваться. Утром он съел бы зеленый инжир, а потом съел злого человека go на перекус.

и это текстовый файл, из которого была сгенерирована эта история:

Это история о том, как стал . Когда-то около 1010 a go, , s бродили по земле. Один из них был назван . Этот был один в мире. Затем он стал , живущим в . Это животное любило и . Утром он съел бы , а позже съел бы на закуску.

Ответы [ 3 ]

3 голосов
/ 07 января 2020

Проблема в том, что вы определенно удалите тот, который назначен на substitute. Но ты не вернешь это. Вы возвращаете еще один случайный. То есть вы не удалили тот, который вернули.

Так и должно быть.

    private String getSubstitute(String label) {
        if (listMap.get(label) != null){
            String substitute = randomFrom(listMap.get(label));
            listMap.get(label).remove(substitute);
            return substitute;
        }
        if (label.equals("number")){
            return " " + myRandom.nextInt(50) + 5;
        }
        return "**UNKNOWN**";
     }
1 голос
/ 07 января 2020

Вы не удаляете то, что возвращает getSubstitute. Вы возвращаете следующее случайное слово, которое Вы сгенерировали в конце:

return randomFrom(listMap.get(label));

0 голосов
/ 07 января 2020

В строке №: 5

return substitute;

вместо

return randomFrom(listMap.get(label));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...