Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hashmap и добавление элементов 
V
    Опции темы
Vasya
Дата 22.11.2013, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 5.7.2003

Репутация: нет
Всего: нет



Здравствуйте!

Пишу я себе небольшуя программулину под андроид и стoлкнулся со следующим приколом от HashMap. Имеем:
Код

ArrayList<Map<String, String>> data = new ArrayList<Map<String, String>>();
Cursor c = db.rawQuery(".....");
.....

Map<String, String> m;
do {
    m = new HashMap<String, String>();
    m.put("id", Integer.toString(c.getInt(colId)));
    m.put("address", c.getString(colAddress));
    m.put("amount", Settings.nf.format(c.getDouble(colAmount)));
    m.put("credit",  Settings.nf.format(c.getDouble(colCredit)));
    data.add(m);
} while (c.moveToNext());


 При добавлении третьего ключа ("amount"), ключ и значение "id" исчезают, потому что перезаписываются "amount"! Это чудо явно наблюдается под отладчиком, там же видно, что hash этих ключей разный. Как тут быть, ведь мне нужно хранить значение ключей "id" и "amount" одновременно!  smile Спасибо!
PM MAIL   Вверх
Pawl
Дата 22.11.2013, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28



Цитата(Vasya @  22.11.2013,  15:07 Найти цитируемый пост)
При добавлении третьего ключа ("amount"), ключ и значение "id" исчезают

А при добавлении второго все на месте? Дело в том, что вы вместо того, чтобы добавлять записи в один объект HashMap, каждый раз добавляете их в разные:
Код

Map<String, String> m; // создание переменной типа Мар
do {
    m = new HashMap<String, String>(); // создание  объекта HashMap, на который будет
    // ссылаться m. На каждом шаге цикла будет создаваться новый объект
    ... 
} while (c.moveToNext());

Может, лучше сделать так?
Код

Map<String, String> m = new HashMap<String, String>()
do {
    ... 
} while (c.moveToNext());




--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Vasya
Дата 22.11.2013, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 5.7.2003

Репутация: нет
Всего: нет



Цитата(Pawl @ 22.11.2013,  15:39)
Цитата(Vasya @  22.11.2013,  15:07 Найти цитируемый пост)
При добавлении третьего ключа ("amount"), ключ и значение "id" исчезают

А при добавлении второго все на месте? Дело в том, что вы вместо того, чтобы добавлять записи в один объект HashMap, каждый раз добавляете их в разные:
Код

Map<String, String> m; // создание переменной типа Мар
do {
    m = new HashMap<String, String>(); // создание  объекта HashMap, на который будет
    // ссылаться m. На каждом шаге цикла будет создаваться новый объект
    ... 
} while (c.moveToNext());

Может, лучше сделать так?
Код

Map<String, String> m = new HashMap<String, String>()
do {
    ... 
} while (c.moveToNext());


Немного уточню:
У меня есть ArrayList<Map<String, String>>. Именно в него я добавляю объект HashMap<String, String>, и кажды раз новый. Так вот, после того, как я создаю новый объект HashMap<String, String>(), я начинаю пихать в него данные. Сначала я добавляю элемент "id" = "5500". Пока все нормально. Затем я добавляю еще элемент, "address" = "Pushkina 5". Полет нормальный. Затем еще один элемент: "amount" = "10.000". Пипец. Если до этого у меня в HashMapе можно было получить значение ключа "id", которое равно "5500", то теперь  место этого элемента занял новый c ключем "amount" со значением "10.000".  Почему в hashmap не добавляется новый элемент, не смотря на то что ключ уникальный ("id" <> "amount")?;

P.S. В процессе поиска ответа наткнулся на подобный вопрос на Stackoverflow. Но там автора вопроса признали сумашедшим, и сказали, что такого не может быть  smile. Мол, перезапись возможна, только если ключ совпал smile

Это сообщение отредактировал(а) Vasya - 22.11.2013, 16:19
PM MAIL   Вверх
Pawl
Дата 22.11.2013, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28



Цитата(Vasya @  22.11.2013,  16:10 Найти цитируемый пост)
Почему в hashmap не добавляется новый элемент

Вообще, действительно странно! Только что смоделировал процесс у себя:
Код

import java.util.*;

public class Main {

    public static void main(String[] args) {
        ArrayList<Map<String, String>> data = new ArrayList<Map<String, String>>();
        Map<String, String> m;
        int i = 0;
        do {
            m = new HashMap<String, String>();
            m.put("id", Integer.toString(1));
            m.put("address", "street");
            m.put("amount", Double.toString(new Double(2.)));
            m.put("credit",  Double.toString(new Double(3.)));
            data.add(m);
        } while (++i <=10);
        for(Map<String, String> mp : data) {
            for (Map.Entry<String, String> e : mp.entrySet()) {
                 System.out.println(e.getKey() + " " + e.getValue());
            }
            System.out.println();
        }
    }
}

Все работает, как надо... Андроида под рукой нет, так что моделировал на JDK. Попробуйте максимально упростить код с ошибкой в андроиде, может, ошибка локализуется... 


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Vasya
Дата 22.11.2013, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 5.7.2003

Репутация: нет
Всего: нет



Вопрос снимается. Проверил работу кода с выводом в консоль, нашел собственный косяк. Все работает как надо. А вот отладчик ввел в заблуждение, показывал всякую фигню, вот я и стал грешить на HashMap.  smile Ну, и конечно, пятница.

Это сообщение отредактировал(а) Vasya - 22.11.2013, 21:47
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0440 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.