Извлечение из HashMap из HashMap в Java 1.8 - PullRequest
0 голосов
/ 04 декабря 2018

Для следующего кода при распечатке HashMap из HashMap temp, почему он печатает

{0={PRICE=2.2, NAME=2str}, 1={PRICE=2.2, NAME=2str}}

в качестве вывода вместо получения {0={PRICE=2, NAME=1str}, 1={PRICE=2.2, NAME=2str}}?

Пожалуйста, сообщите, если для создания таких хэш-карт используется другая фундаментальная концепция?

Я попытался вставить temp.clear(); после test.put(0,temp);, но результат остался прежним.

import java.util.*;

public class TestClass {

    public static void main(String args[]){
        HashMap<Integer,HashMap<String, Object>> test = new HashMap<Integer,HashMap<String, Object>>();
        HashMap<String,Object> temp = new HashMap<String, Object>();

        temp.put("NAME","1str");
        temp.put("PRICE", 2);

        test.put(0,temp);
        System.out.println(temp);

        temp.put("NAME","2str");
        temp.put("PRICE",2.2);
        test.put(1,temp);

        System.out.println(temp);
        System.out.println(test);
    }

}

Ответы [ 5 ]

0 голосов
/ 05 декабря 2018

Это происходит, когда вы вводите тест с тем же temp .Когда вы вводите temp , он меняет свою предыдущую пару ключ-значение, а также значение ключа 0 в test .

Вы написали, что очистили карту temp .ОК, clear удаляет все пары ключ-значение карты, как c ++.Но очистка temp также убрала значение 0 , ключ test .Затем, когда вы снова вводите значение temp , оно меняет свое предыдущее значение (которое пусто, если вы очищаете temp) клавиши 0 из test .

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

public static void main(String[] args) {
    HashMap<Integer,HashMap<String, Object>> test = new HashMap<Integer,HashMap<String, Object>>();
    HashMap<String,Object> temp = new HashMap<String, Object>();

    temp.put("NAME","1str");
    temp.put("PRICE", 2);
    test.put(0,temp);
    System.out.println("After first put:");
    System.out.println("temp is: " + temp);
    System.out.println("test is: " + test);

    temp.clear();
    System.out.println("After clearing it:");
    System.out.println("temp is: " + temp);
    System.out.println("test is: " + test);

    temp.put("NAME","2str");
    temp.put("PRICE",2.2);

    System.out.println("After second put in temp, you haven't put in test yet:");
    System.out.println("temp is: " + temp);
    System.out.println("test is: " + test);
    test.put(1,temp);

    System.out.println("After second put:");
    System.out.println("temp is: " + temp);
    System.out.println("test is: " + test);
}
0 голосов
/ 04 декабря 2018

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

Ответ: Java строго передается по значению, но она передает значение в стеке, которое для объектов оказывается ссылкой на объект в куче.

Что это означает вконтекст вашего вопроса заключается в том, что когда вы добавляете временный объект в тестовую карту, вы действительно добавляете ссылку на временный объект.Это означает, что когда вы затем изменяете временный объект дальше, вы модифицируете тот же объект, который вы только что добавили на тестовую карту, потому что ссылка на временный объект такая же, как временный объект, который вы добавили в карту.Причина, по которой значения индексов 0 и 1 одинаковы, заключается в том, что они в буквальном смысле являются одним и тем же объектом.

0 голосов
/ 04 декабря 2018

Создайте новый экземпляр для temp, не используйте старый ...
Примерно так:

public static void main(String args[]){
    HashMap<Integer,HashMap<String, Object>> test = new HashMap<Integer,HashMap<String, Object>>();
    HashMap<String,Object> temp = new HashMap<String, Object>();

    temp.put("NAME","1str");
    temp.put("PRICE", 2);

    test.put(0,temp);
    System.out.println(temp);

    temp = new HashMap<String, Object>();
    temp.put("NAME","2str");
    temp.put("PRICE",2.2);
    test.put(1,temp);

    System.out.println(temp);
    System.out.println(test);
}
0 голосов
/ 04 декабря 2018

Используйте другой экземпляр HashMap, это сделает хитрость

public static void main(String[] args) {
    HashMap<Integer, HashMap<String, Object>> test = 
                          new HashMap<Integer, HashMap<String, Object>>();
    HashMap<String, Object> temp = new HashMap<String, Object>();

    temp.put("NAME", "1str");
    temp.put("PRICE", 2);

    test.put(0, temp);
    System.out.println(temp);

    HashMap<String, Object> temp1 = new HashMap<String, Object>();
    temp1.put("NAME", "2str");
    temp1.put("PRICE", 2.2);
    test.put(1, temp1);

    System.out.println(temp);
    System.out.println(test);
}

Вы не получили ожидаемый результат, потому что когда вы делаете

temp.put("NAME","2str");

, вы заменяетепредыдущее значение для ключа NAME.То же самое происходит, когда вы делаете

temp.put("PRICE",2.2);

Чтобы избежать этого, вы можете создать новый HashMap и предотвратить замену значений для того же ключа .

0 голосов
/ 04 декабря 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...