Как поместить несколько значений в Map из списка

Вопрос: У меня есть список gotitems. ArrayList gotitems = new ArrayList(); Мне нужно поместить этот список в hashmap, называемый map. Map map = new HashMap(); я пробовал это: for(String s:gotitems){ map.put("a",s); } gotitems содержит: First Second Third Но вывод: System.out.println(map.values()); дает: Third Third Third я даже пробовал это: for(String s:gotitems){ for(int j=0;j

Вопрос:

У меня есть список gotitems.

ArrayList<String> gotitems = new ArrayList<String>();

Мне нужно поместить этот список в hashmap, называемый map.

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

я пробовал это:

for(String s:gotitems){ map.put(«a»,s); }

gotitems содержит:

First Second Third

Но вывод:

System.out.println(map.values());

дает:

Third Third Third

я даже пробовал это:

for(String s:gotitems){ for(int j=0;j<gotitems.size();j++){ map.put(«a»+j,s); } }

но это тоже не работает.

Что я здесь делаю неправильно?

Лучший ответ:

Согласно методу Map put (K, V) docs

Связывает указанное значение с указанным ключом на этой карте (дополнительная операция). Если в карте ранее содержалось сопоставление для ключа, старое значение заменяется указанным значением.

Каждый раз здесь вы овервердируете ключ.

for(String s:gotitems){ map.put(«a»,s); }

каждый раз меняйте ключ и пытайтесь

for(String s:gotitems){ map.put(s,s); } Ответ №1

Это происходит из-за того, что вы помещаете все элементы на карте против одного и того же ключа “a”,

map.put(«a»);

Вам нужно сохранить каждый элемент против уникального ключа, чтобы добавить что-то вроде этого:

int count = 0; for(String s:gotitems){ map.put(«a» + count,s); count++; } Ответ №2

Вы пытаетесь поместить три строки в карту под одним и тем же ключом «a». Попробуйте использовать уникальные ключи для своих значений.

Ответ №3

Вы помещаете все свои объекты на Map с тем же ключом: “a”. Для каждого значения должен иметь уникальный String ключ.

Например:

List<String> list = new ArrayList<String>(); list.add(«one»); list.add(«two»); list.add(«three»); Map<String, String> map = new LinkedHashMap<String, String>(); for (String s: list) { map.put(s, s); } System.out.println(map);

Вывод:

{one=one, two=two, three=three}

Обратите внимание на LinkedHashMap здесь: он поддерживает порядок, в котором вы ставите свои пары ключ/значение.

Редактирование Конечно, если ваш List не имеет уникальных значений, перемещение его значений в качестве ключей к Map приведет к перезаписи некоторых значений Map. В этом случае вы должны убедиться, что у вашего List есть уникальные ключи, или, возможно, используйте Map<Integer, String> с индексом значения List качестве ключа к Map и фактическим значением List как значение для Map.

Ответ №4

Когда вы пишете

for(String s:gotitems){ map.put(«a»,s); }

вы удалите любую существующую запись на карте, удерживаемой против ключа “a”. Поэтому после вашей итерации ваша карта будет содержать только одну запись, соответствующую последнему итерированному значению в gotitems.

Чтобы эффективно использовать карту, вам нужно рассмотреть, какие будут ваши ключи. Затем используйте map.put(myKeyForThisItem, s). Если у вас нет эффективной схемы для ключей, то использование карты бессмысленно, поскольку вы обычно используете ключи для извлечения соответствующих значений.

Что касается вашего второго подхода, было бы полезно, если бы вы могли определить “он не работает” немного яснее: возможно, итерация по карте и печать ключей и значений.

Ответ №5

Обратите внимание, что на карте ключ может указывать не более одного значения. В вашем случае вы выполняете следующие сопоставления:
“a” → “one”, то вы переписываете его как
“a” → “two”, тогда вы перезаписываете его как
“a” → “three”

помните: ключ может указывать на максимум одно значение. Однако значение может указывать на несколько ключей.

Ответ №6

Это не верно:

for(String s:gotitems){ map.put(«a»,s); }

Поскольку вы используете «a» общий” ключ для всех значений, последняя вставленная пара ключ-значение будет сохранена, все предыдущие будут отменены.

Это также неверно:

for(String s:gotitems){ for(int j=0;j<gotitems.size();j++){ map.put(«a»+j,s); } }

вы кладете n * n раз на карту, хотя вы хотите gotitems.size() только n (gotitems.size()) элементов.

Первое решение на ключ, который вы хотите использовать на карте, копирование List на Map один подход может быть использование индекса, как key:

for(int j=0;j<gotitems.size();j++){ map.put(«KEY-«+j,gotitems.get(j)); }

Выход должен быть:

KEY-0 Сначала

KEY-1 Second

КЛЮЧ 2-й

Ответ №7

Я воспроизводил ваши коды. Проблема в том, что вы назначаете один и тот же ключ другому значению. Это должно сработать.

import java.util.*; public class testCollection{ public static void main(String[] args){ ArrayList<String> gotitems = new ArrayList<String>(); gotitems.add(«First»); gotitems.add(«Second»); gotitems.add(«Third»); Map<String,String> map = new HashMap<String,String>(); String x = «a»; int i = 1; for(String s:gotitems){ map.put(x+i,s); i++; } System.out.println(map); } }

Оцените статью
Добавить комментарий