Java: использование hashmap, получение всех значений и вызов методов - PullRequest
3 голосов
/ 16 июня 2011

У меня есть необходимость хранить список динамически создаваемых объектов таким образом, чтобы их можно было извлекать и вызывать их методы по требованию.

Насколько я вижу для списка и создания,HashMap соответствует моим потребностям, но я немного озадачен, вспоминая объекты и вызывая их методы, используя HashMap.

Просто в качестве ссылки позвольте мне дать вам небольшой код:

ВотHashMap:

Map<String, Object> unitMap = new HashMap<String, Object>();

// here is how I put an object in the Map notice i'm passing coordinates to the constructor:
unitMap.put("1", new Worker(240, 240));
unitMap.put("2", new Worker(240, 240));

Теперь мне нужно создать метод, который извлекает каждый объект из хэш-карты и вызывает метод из каждого объекта.это возможно, или на созданные объекты можно ссылаться только напрямую.Если это так, есть ли другой способ динамического вызова метода всех существующих экземпляров класса (другими словами, при вводе пользователем)?

Ответы [ 3 ]

10 голосов
/ 16 июня 2011

Конечно.Вы можете сделать это:

for (Object thing : unitMap.values()) {
    // use "thing" here
}

Если вам тоже нужны ключи, вы можете получить только ключи:

for (String key : unitMap.keySet()) {
    // use "key" here
}

или ключи и значения вместе:

for (Map.Entry<String, Object> entry : unitMap.entrySet()) {
    // use "entry.getKey()" and "entry.getValue()"
}

Во всех вышеперечисленных случаях каждая запись на карте просматривается одна за другой.Таким образом, в конце цикла вы обработаете все записи на карте.

1 голос
/ 16 июня 2011

Если все значения на карте являются Worker объектами, вы должны объявить, что ваша карта имеет тип Map<String, Worker>. Таким образом, когда вы извлекаете значение из карты, оно будет напечатано как Worker. Таким образом, вы можете вызывать любой метод, объявленный в Worker, а не проверять тип во время выполнения, используя instanceof.

Если карта содержит разные значения, и вам необходимо сохранить тип значения как Object, может быть целесообразно использовать интерфейс для определения метода, который вы хотите вызывать для каждого отдельного типа объекта.

Если вы не знаете, какой метод вы хотите использовать для значений до времени выполнения, и карта может содержать разные значения, вам просто нужно будет сделать то, что вы в настоящее время делаете, и использовать Map<String, Object>.

Наконец, чтобы получить значения карты, вы делаете то же, что упоминал Крис Джестер-Янг до меня. Самым большим преимуществом, как я уже говорил ранее, является то, что ваши объекты будут напечатаны, и вам не нужно будет проверять приведение / instanceof.

0 голосов
/ 29 января 2014

Я использую это, чтобы поместить все значения из hashMap в список, надеюсь, это поможет.

private List<String> getValuesFromHashMap(HashMap<String, String> hashMap) {

    List<String> values = new ArrayList<String>();

    for (String item : hashMap.values()) {
        values.add(item);
    }

    return values;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...