Возможно ли иметь хэш-карту с 4 объектами? - PullRequest
5 голосов
/ 20 сентября 2010

Могу ли я иметь hashMap с скажем ID в качестве моего ключа и информацию, имя, количество в качестве моих значений?

хорошо, скажем, у меня уже есть класс (Products), который устанавливает мои переменные, методы получения и установки. В моем классе Invoice, где будет hashMap. Буду ли я ставить как:

private HashMap<String, Products> keys = new HashMap<String, Products>

Я не совсем уверен, как получить доступ к HashMap, хотя. Скажем, я реализую класс, который позволяет мне добавлять и удалять счета из HashMap, я не знаю, какие значения будут:

keys.put(??value of id??,??not sure what goes here??);

Ответы [ 10 ]

19 голосов
/ 20 сентября 2010

Конечно. Создайте другой класс, содержащий ваши данные, имя и количество, и укажите это в качестве значения вашей HashMap.

7 голосов
/ 20 сентября 2010

Нет, но лучший способ - обернуть информацию, которую вы хотите сохранить на карте, в класс:

public class Info {
  private String info;
  private String name;
  private int quantity;

  ...

  public Info(String info, String name, int quantity) {
     ...
  }
}

Затем сделайте это, чтобы поместить что-то на карту:

Info info = new Info("info", "name", 2);
Map map = new HashMap<Integer, Info>();
map.put(22, info);

И сделайте это, чтобы получить что-то:

Info info = map.get(22)
1 голос
/ 20 сентября 2010

Как насчет HashMap<Integer, ArrayList<String>>?

ОБНОВЛЕНИЕ: Пожалуйста, постарайтесь избежать этого, этот - лучший подход.

0 голосов
/ 25 сентября 2018

Я думаю, что MultiMap из библиотеки Google может служить цели

https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/Multimap.html

    Multimap<String, String> map = ArrayListMultimap.create();
    String key = "uniqueKey";
    map.put(key, "value1");
    map.put(key, "value2");
    map.put(key, "value3");

    System.out.println(map);//{uniqueKey=[value1, value2, value3]}
0 голосов
/ 22 июля 2016

Создайте объект, который объединяет четыре вместе. Что-то вроде:

public class Foo {
    private String s1;
    private String s2; 
    private int v3;
    private MyObject obj1
    // constructors, getters, helper functions.
}
0 голосов
/ 20 сентября 2010

Одной из проблем при использовании карты будет использование жестко закодированных ключей. Если ключ является строкой, а ключ изменяется. Можно использовать константу вместо жестко закодированной строки.

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

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

0 голосов
/ 20 сентября 2010

Конечно.В зависимости от того, насколько гибок ваш набор данных, вы можете использовать Hashmap а-ля:

  • HashMap<IdType, List<String>>, с IdType String или Integer, в зависимости от ключей, которые вы хотите использовать.
  • HashMap<IdType, String[]>
  • HashMap<IdType, YourObjectType>, с YourObjectType, являющимся объектом, который вы определили сами, и удерживая значения, которые вам нравятся

YourObjectType, конечно, может быть чем угоднокак объект.Также еще один HashMap, если хотите.

0 голосов
/ 20 сентября 2010

Не совсем.

Карта определяет строгое отношение 1 к 1 между ключами и значениями. Один ключ на карте имеет одно значение.

Если вы хотите связать несколько значений с одним ключом, вам нужно выполнить одно из следующих действий:

  • Определите класс Values для представления значений как одного объекта; например согласно ответам @ Starkey и @ Javed. Тогда карта становится Map<String, Values> (при условии, что тип ключа - String).

  • Определить карту как Map<String,List<Object>> или Map<String,Object[]> и представить значения в виде нетипизированного списка / массива

  • Определите карту как Map<String,Properties> или Map<String,Map<String,Object>> и представьте значения как эквивалент Java ассоциативного массива.

Из них первый вариант является одновременно самым безопасным (с наименьшей вероятностью возникновения ошибок во время выполнения), наиболее эффективным и лучшим стилем.

(Кроме того, общие возможности Apache MultiMap могут рассматриваться как другая возможность, но концептуальная модель и API-интерфейсы не совсем соответствуют этому варианту использования.)

0 голосов
/ 20 сентября 2010

Вы можете иметь идентификатор в качестве ключа и List или Set (Collection в целом) объектов в качестве значения.

0 голосов
/ 20 сентября 2010

Конечно, вы можете, например, объявить это следующим образом: HashMap<Integer, HashMap<String,Object>> Вы используете внешнюю хэш-карту, чтобы связать свой идентификатор с вашей внутренней HashMap, а во внутренней вы создаете ключи "info", "name", " количество "и связать значения с ними.

Конечно, вы также можете использовать ArrayList в качестве внешней коллекции (это может быть лучше для вашего идентификатора: ArrayList<HashMap<String,Object>> таким образом, у вас есть индексированный (на основе идентификатора) доступ к каждому из ваших «info», «name» "," количество "hashmap" records "

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