Рефакторинг класса с использованием ArrayList для использования HashMap (Java)

#java #hashmap

#java #hashmap

Вопрос:

Мне сказали изменить все на HashMap () вместо ArrayList () и по большей части все работало идеально. Однако у меня возникла проблема с правильной работой этого метода.

мой HashMap () выглядит следующим образом

частная хэш-карта critMap = новая хэш-карта();

У меня есть класс Room и класс Creature В Room могут быть существа. Существа должны иметь возможность реагировать на определенные команды, для которых у меня уже есть методы, и должны работать до тех пор, пока этот метод правильный. Я не уверен, что не так.

Это метод с ArrayList()

 public void critReactRoomStateChange2(String command, PC pc, String name) {
    Creature temp = null;
    for (int i = 0; i < critArr.size(); i  ) {
        if (!(getCreatures().get(i) instanceof PC) amp;amp; !(getCreatures().get(i).getName().equals(name))) {
            temp = getCreatures().get(i);
            if (temp != null) {
                getCreatures().get(i).reactStateChange(command, pc);
                temp.checkNewRoom();
                if (!temp.equals(getCreatures().get(i))) {
                    i--;
                }
            }
        }
    }
}
  

ЭТО МЕТОД ПОСЛЕ ТОГО, КАК я УСТАЛ ВНЕДРЯТЬ HashMap()

 public void critReactRoomStateChange(String command, PC pc, String name) {
    Creature temp = null;
    if (!(getCreatures().get(name) instanceof PC)) {
        temp = getCreatures().get(name);
        if (temp != null) {
            getCreatures().get(name).reactStateChange(command, pc);
            temp.checkNewRoom();
        }
    }
}
  

getCreatures().get(name) принимает строковое имя, которое передается ему в качестве ключа HashMap, чтобы найти фактический объект, на который он ссылается. Таким образом, как указано выше, моя хэш-карта — это имя существа, являющееся строкой (ключом), а значение Creature (содержит другую информацию, отличную от имени) — это значение. Когда я вызываю getCreature().get(имя) Я ищу имя ключевой строки и хочу, чтобы оно возвращало объект Creature. Если он не может найти его в HashMap, он должен вернуть null, если я не ошибаюсь.

Возможно, я просто упускаю что-то действительно простое. Любая помощь была бы высоко оценена. Если потребуется больше кода, я бы с удовольствием отредактировал это и вставил.
Спасибо

Редактировать: Класс Creature является абстрактным, и ПК, Animal, NPC — все его расширяют. Просто чтобы вам не было интересно, что делают случайный компьютер, NPC и животные. лол

Редактирование 2: Никакой ошибки, кроме того, что я не получаю реакции. Это ничего не дает, поэтому critreactroom StateChange сейчас не работает. Существа не передаются вместе, поэтому другие методы могут воздействовать на них.

Итак, вторая часть кода не работает должным образом. По сути, это ничего не дает.

Комментарии:

1. какой метод не работает должным образом? вы получаете какую-либо ошибку?

2. Как насчет того, чтобы вместо добавления кода подробнее рассказать о том, каковы ваши намерения относительно исходного метода. Почему каждая строка делает то, что она делает?

3. Никакой ошибки, кроме того, что я не получаю реакции. Это ничего не дает, поэтому critreactroom StateChange сейчас не работает. Существа не передаются вместе, поэтому другие методы могут воздействовать на них.

4. Я также хотел бы отметить, что вы выбрали формулировку в своем названии довольно неудачно. «Реализация HashMap» обычно подразумевает, что вы пишете свою собственную версию HashMap, в то время как то, что вы делаете, больше похоже на «Рефакторинг класса с использованием ArrayList для использования HashMap».

5. Хорошо, это исправлено, я приношу извинения. Дайте мне минуту, и я исправлю код и добавлю лучшее определение к своему вопросу.

Ответ №1:

Я вижу, что при использовании ArrayList вы применили метод getCreatures().get(i). Возможно, вы не изменили метод getCreatures() после переключения на HashMap, поскольку после изменения вам не нужно выполнять цикл и получать (i).

Комментарии:

1. Я думаю, что эта проблема сводится к циклу, это всего лишь выбор первой вещи на карте или значения имени Sting. Я думаю, что мне нужно сделать, это создать итератор, который циклически просматривает всю HashMap и запрашивает каждое существо на этой карте, должно ли оно реагировать на изменения. Я думаю, что я перепутал свой первоначальный метод с новым, потому что я не мог использовать цикл for, и я просто пропустил его, думая, что это должно сработать, потому что вы можете посмотреть имя только из строкового значения с помощью HashMap. Короче говоря, это строковое имя не должно быть единственным, что я проверяю. Спасибо всем за вашу помощь

2. ага. я думал, что это ваша проблема. но ваш друг предложил вам использовать hashmap именно для того, чтобы вам не приходилось перебирать его. я полагаю, вы должны иметь возможность легко модифицировать свой метод getCreatures, чтобы ключ имени строки был единственным необходимым вводом для получения вашего объекта Creature. Меньше циклов = лучше в этом случае.