Обновление HashMap ArrayList - PullRequest
       16

Обновление HashMap ArrayList

4 голосов
/ 01 декабря 2011

Я только начинаю учиться использовать HashMap и читаю учебник по Java, но у меня возникают проблемы.

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

 HashMap<String, ArrayList<String>> mMap = new HashMap<String, ArrayList<String>>();
        ArrayList<String> list = new ArrayList<String>();
        mMap.put("A", list);
        mMap.put("B", list);
        mMap.put("C", list);
        mMap.put("D", list);

        Iterator iter = mMap.entrySet().iterator();

        if (mMap.containsKey("A"))
        {   
            Map.Entry mEntry = (Map.Entry) iter.next();
            list.add("test");
            mMap.put("A",list);
            System.out.println(mEntry.getKey() + " : " + mEntry.getValue());
        }
        else if (mMap.containsKey("B"))
        {   
            Map.Entry mEntry = (Map.Entry) iter.next();
            list.add("entry");
            mMap.put("B",list);
            System.out.println(mEntry.getKey() + " : " + mEntry.getValue());
        }

Ответы [ 5 ]

11 голосов
/ 01 декабря 2011

Вы можете использовать что-то вроде:

mMap.get("A").add("test");
mMap.get("B").add("entry");
6 голосов
/ 01 декабря 2011
  1. Как сказал @Tudor, используйте mMap.get ("A"). Add ("foo");

  2. Вы помещаете тот же самый точный список вкаждая запись на карте.Исходные строки должны быть

    mMap.put("A", new ArrayList());
    mMap.put("B", new ArrayList()); 
    ...
    mMap.put("Z", new ArrayList());

Альтернативно, напишите метод, который проверяет на лету

public synchronized void myAdd(String key, String value) {
   List<String> there = mMap.get(key);
   if (there == null) {
      there = new ArrayList<String>();
      mMap.put(key, there);
   }
   there.add(value);
}
2 голосов
/ 01 декабря 2011

Вы, вероятно, имеете в виду:

HashMap<String, List<String>> mMap = new HashMap<String, List<String>>();
    mMap.put("A", new ArrayList<String>());
    mMap.put("B", new ArrayList<String>());
    mMap.put("C", new ArrayList<String>());
    mMap.put("D", new ArrayList<String>());

    if (mMap.containsKey("A"))
    {   
        mMap.get("A").add("test");
        System.out.println(mEntry.getKey() + " : " + mEntry.getValue());
    }
    else if (mMap.containsKey("B"))
    {   
        mMap.get("B").add("entry");
        System.out.println(mEntry.getKey() + " : " + mEntry.getValue());
    }
   ...

Интересно, действительно ли вам нужны эти проверки containsKey!НТН!

1 голос
/ 01 декабря 2011

Я думаю, что в вашем случае вы можете использовать Google Guava Multimap и ListMultimap интерфейсы и ArrayListMultimap реализация.

Выбор правильной коллекции (в ссылке есть только стандартные коллекции, но Multimap в этом случае прав) делает код более читабельным:

ListMultimap<String, String> myMultimap = ArrayListMultimap.create();
myMultimap.put("A", "test");
myMultimap.put("B", "entry");

, тогда myMultimap.get("A") даетВы перечисляете (на самом деле ArrayList экземпляр) с одним элементом: "test", тогда как myMultimap.get("C") дает вам пустой список.

По сравнению с Map<String, List<String>> подходом:

  • вам не нужно инициализировать клавишу "C" с пустым списком для него,
  • у вас нетnull с проверками (без NullPointerException с),
  • вам не нужно делать другие проверки, такие как myMap.containsKey("A"),
  • вы пишете меньше кода,
  • так что ваш код менее подвержен ошибкам,
  • и т. д. и т. д.

PS Вместо:

HashMap<String, ArrayList<String>> mMap = new HashMap<String, ArrayList<String>>();

используйтеинтерфейсы, а не классы при использовании коллекций , то есть:

Map<String, List<String>> mMap = new HashMap<String, List<String>>();

и даже лучше "статических конструкторов" Гуавы (вы не повторяете код):

Map<String, List<String>> mMap = Maps.newHashMap()

когда знания ореализация не обязательна.

0 голосов
/ 01 декабря 2011

Если вы добавите один и тот же список в качестве значения с разными ключами, в вашем случае все ключи A, B, C и D будут указывать на один и тот же список, а доступ к списку и его обновление одним нажатием будут отображать изменения во всех списках. Каждый ключ указывает на одну и ту же структуру списка.

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

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

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