Подтвердить что ты не робот

Сохранение и извлечение значений ArrayList из hashmap

У меня есть hashmap следующего типа

HashMap<String,ArrayList<Integer>> map=new HashMap<String,ArrayList<Integer>>();    

Значения хранятся следующим образом:

mango | 0,4,8,9,12
apple | 2,3
grapes| 1,7
peach | 5,6,11

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

РЕДАКТИРОВАТЬ 1

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

РЕДАКТИРОВАТЬ 2

Как я могу указать на arraylist при добавлении?

Я получаю ошибку при добавлении нового номера 18 в строку map.put(string,number);

4b9b3361

Ответ 1

Наша переменная:

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

Чтобы сохранить:

map.put("mango", new ArrayList<Integer>(Arrays.asList(0, 4, 8, 9, 12)));

Чтобы добавить числа один и один, вы можете сделать что-то вроде этого:

String key = "mango";
int number = 42;
if (map.get(key) == null) {
    map.put(key, new ArrayList<Integer>());
}
map.get(key).add(number);

В Java 8 вы можете использовать putIfAbsent, чтобы добавить список, если он еще не существует:

map.putIfAbsent(key, new ArrayList<Integer>());
map.get(key).add(number);

Используйте метод map.entrySet() для итерации:

for (Entry<String, List<Integer>> ee : map.entrySet()) {
    String key = ee.getKey();
    List<Integer> values = ee.getValue();
    // TODO: Do something.
}

Ответ 2

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

public class WorkSheet {
    HashMap<String,ArrayList<Integer>> map = new HashMap<String,ArrayList<Integer>>();

public static void main(String args[]) {
    WorkSheet test = new WorkSheet();
    test.inputData("mango", 5);
    test.inputData("apple", 2);
    test.inputData("grapes", 2);
    test.inputData("peach", 3);
    test.displayData();

}
public void displayData(){
    for (Entry<String, ArrayList<Integer>> entry : map.entrySet()) {
        System.out.print(entry.getKey()+" | ");
        for(int fruitNo : entry.getValue()){
            System.out.print(fruitNo+" ");
        }
        System.out.println();
    }
}
public void inputData(String name ,int number) {
    Random rndData = new Random();
    ArrayList<Integer> fruit = new ArrayList<Integer>();
    for(int i=0 ; i<number ; i++){
        fruit.add(rndData.nextInt(10));
    }
    map.put(name, fruit);
}
}

OUTPUT

grapes | 7 5 
apple | 9 5 
peach | 5 5 8 
mango | 4 7 1 5 5 

Ответ 3

Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
     Map.Entry pairs = (Map.Entry)it.next();

     if(pairs.getKey().equals("mango"))
     {
        map.put(pairs.getKey(), pairs.getValue().add(18));
     }

     else if(!map.containsKey("mango"))
     {
        List<Integer> ints = new ArrayList<Integer>();
        ints.add(18);
        map.put("mango",ints);
     }

     it.remove(); // avoids a ConcurrentModificationException
}

EDIT: Поэтому во время этого попробуйте следующее:

map.put(pairs.getKey(), pairs.getValue().add(number))

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

ИЗМЕНИТЬ 2: Затем добавьте следующее внутри цикла while:

if(pairs.getKey().equals("mango"))
{
    map.put(pairs.getKey(), pairs.getValue().add(18));
}

else if(!map.containsKey("mango"))
{
     List<Integer> ints = new ArrayList<Integer>();
     ints.add(18);
     map.put("mango",ints);
 }

ИЗМЕНИТЬ 3: Читая ваши требования, я пришел к выводу, что вам может не понадобиться цикл. Вы можете проверить только, содержит ли карта ключ mango, и если он добавляет 18, то создайте новую запись на карте с ключом mango и значением 18.

Итак, вам может понадобиться следующее: без цикла:

if(map.containsKey("mango"))
{
    map.put("mango", map.get("mango).add(18));
}

else
{
    List<Integer> ints = new ArrayList<Integer>();
    ints.add(18);
    map.put("mango", ints);
}

Ответ 4

for (Map.Entry<String, ArrayList<Integer>> entry : map.entrySet()) {
 System.out.println( entry.getKey());     
 System.out.println( entry.getValue());//Returns the list of values
}

Ответ 5

Извлечь все сразу =

List<Integer> list = null;

if(map!= null) 
{ 
  list = new ArrayList<Integer>(map.values()); 
}

Для сохранения =

if(map!= null) 
{ 
  list = map.get(keyString); 
   if(list == null)
    {
         list = new ArrayList<Integer>();
    }
  list.add(value);
  map.put(keyString,list);
}

Ответ 6

Вы можете попробовать использовать MultiMap вместо HashMap

Инициализация потребует меньше строк кодов. Добавление и извлечение значений также сократит время.

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

станет:

Multimap<String, Integer> multiMap = ArrayListMultimap.create();

Вы можете проверить эту ссылку: http://java.dzone.com/articles/hashmap-%E2%80%93-single-key-and