Сохранение и извлечение значений 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);
Ответы
Ответ 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