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

Получить все значения из ключей HashMap в ArrayList Java

Добрый день, это меня немного смущает (замораживание мозга!) и, похоже, что-то упускает. Имейте ArrayList, который я заполняю HashMap. теперь я вставляю свой HashMap и arraylist.

 Map.put(DATE, value1);
 Map.put(VALUE, value2);

 arraylist.put(Map);

Поскольку мы разбираем JSON, аррайалист увеличивается в значительном размере. теперь мой вопрос заключается в том, как вы получаете значения с обеих клавиш карты в arraylist? я пробовал это

  if(!list.isEmpty()){   // list is an ArrayList

            for(int k = 0; k < list.size(); k++){
                map = (HashMap)list.get(k);
            }

        }

        Log.d(TAG, "map size is" + map.size());

        String [] keys = new String[map.size()];
        String [] date_value = new String[map.size()];

        String [] value_values = new String[map.size()];

        int i = 0;
        Set entries = map.entrySet();
        Iterator iterator = entries.iterator();

        while(iterator.hasNext()){

            Map.Entry mapping = (Map.Entry)iterator.next();
            keys[i] = mapping.getKey().toString(); 
            date_value[i] = map.get(keys[i]);

            if(keys[i].equals(DATE)){
                date_value[i] = map.get(keys[i]);

            } else if(keys[i].equals(VALUE)){
                value_values[i] = map.get(keys[i]);
            }

                   i++;
                 }

Но я не могу получить все значения. размер карты всегда возвращает значение 2, которое является только элементом. как я могу получить все значения из ключей карты в ArrayList? Спасибо

4b9b3361

Ответ 1

Почему вы хотите заново изобрести колесо, когда у вас уже есть что-то, чтобы сделать вашу работу. Map.keySet() метод дает вам набор всех ключей на карте.

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

for (String key: map.keySet()) {
    System.out.println("key : " + key);
    System.out.println("value : " + map.get(key));
}

Кроме того, ваш первый for-loop выглядит странно для меня: -

   for(int k = 0; k < list.size(); k++){
            map = (HashMap)list.get(k);
   }

Вы повторяете свой список и назначаете каждый элемент тому же reference - map, который перезапишет все предыдущие значения. Все, что у вас будет, это последняя карта в вашем списке.

EDIT: -

Вы также можете использовать entrySet, если вам нужен ключ и значение для вашей карты. Это было бы лучше для вас: -

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

    for(Entry<String, Integer> entry: map.entrySet()) {
        System.out.println(entry.getKey());
        System.out.println(entry.getValue());
    }

P.S.: -
Ваш код выглядит мне смешно. Я бы предложил, оставить этот код в стороне и подумать о вашем design еще раз. На данный момент, поскольку код стоит, очень сложно понять, что он пытается сделать.

Ответ 2

Попробуйте так...

Я рассматриваю HashMap с ключом и значение типа String, HashMap<String,String>

HashMap<String,String> hmap = new HashMap<String,String>();

hmap.put("key1","Val1");
hmap.put("key2","Val2");

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

for(Map.Entry<String,String> map : hmap.entrySet()){

     arList.add(map.getValue());

}

Ответ 3

Поместите я ++ где-нибудь в конце вашего цикла.

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

FYI: ниже выполняется избыточный поиск:

if(keys[i].equals(DATE)){                 
   date_value[i] = map.get(keys[i]);              
} else if(keys[i].equals(VALUE)){              
   value_values[i] = map.get(keys[i]);             
} 

заменить

if(keys[i].equals(DATE)){                 
   date_value[i] = mapping.getValue();
} else if(keys[i].equals(VALUE)){              
   value_values[i] = mapping.getValue()
} 

Другая проблема заключается в том, что вы используете i для date_value и value_values. Это недействительно, если вы не намерены иметь нулевые значения в вашем массиве.

Ответ 4

Это невероятно старый, но я наткнулся на него, пытаясь найти ответ на другой вопрос.

Мой вопрос в том, как вы получаете значения с обеих клавиш карты в arraylist?

for (String key : map.keyset()) {
  list.add(key + "|" + map.get(key));
}

Размер карты всегда возвращает значение 2, это всего лишь элементы

Я думаю, вас могут смутить функциональность HashMap. HashMap допускает только отношения от 1 до 1 на карте.

Например, если у вас есть:

String TAG_FOO = "FOO";
String TAG_BAR = "BAR";

и попытайтесь сделать что-то вроде этого:

ArrayList<String> bars = ArrayList<>("bar","Bar","bAr","baR");
HashMap<String,String> map = new HashMap<>();
for (String bar : bars) {
  map.put(TAG_BAR, bar);
}

Этот код закончит установку записи ключа "BAR", которая будет связана с последним элементом в списке bars.

В вашем примере вы, кажется, путаетесь, что есть только два элемента, но у вас есть только два ключа, которые заставляют меня поверить, что вы просто перезаписали каждое поле ключа несколько раз.

Ответ 5

Предположим, что у меня есть Hashmap с ключевым типом данных как KeyDataType и тип данных значения как ValueDataType

HashMap<KeyDataType,ValueDataType> list;

Добавьте все предметы, которые вам нужны. Теперь вы можете получить все ключи hashmap в списке.

KeyDataType[] mKeys;
mKeys=list.keySet().toArray(new KeyDataType[list.size()]);

Итак, теперь вы получили все ключи в массиве mkeys []

теперь вы можете получить любое значение, вызвав

 list.get(mkeys[position]);