Как я могу распечатать LinkedHashMap из ? - PullRequest
0 голосов
/ 30 апреля 2020

Итак, у меня есть класс Spaceship с некоторыми закрытыми переменными, одна из которых имеет LinkedHashMap другого класса и целое число, подобное этому

private LinkedHashMap<Resource, Integer> cargo;

Resource - это абстрактный класс, имеющий несколько типов ресурсов (например, ResourceBlue, ResourceRed, et c ...)

Могу ли я создать LinkedHashMap с абстрактным классом, и если да, то как я go собираюсь это сделать?

Это то, что у меня есть до сих пор:

Конструктор:

public SpaceShip() {

    this.cargoHold = 0;
    this.upgradeLevel = 0;
    this.drone = null;
    this.artifact = 0;
    this.crewMembers = new ArrayList<String>() {
        {
            add("Captain");
            add("Navigation");
            add("Landing");
            add("Shields");
            add("Cargo");
        }
    };
    this.cargo = new LinkedHashMap<Resource, Integer>(){
        {
            cargo.putIfAbsent(new ResourceAzul(), 0);
            cargo.putIfAbsent(new ResourcePreto(), 0);
            cargo.putIfAbsent(new ResourceVerde(), 0);
            cargo.putIfAbsent(new ResourceVermelho(), 0);
        }
    };

}

Когда я запускаю это в своей основной (как тест):

SpaceShip ss = new SpaceShip();
System.out.println(ss);

Это просто дает мне исключение NullPointerException при первом "putIfAbsent" в конструкторе.

Ответы [ 3 ]

2 голосов
/ 30 апреля 2020

То, что вы делаете с этим сокращением, на самом деле довольно сложно. Вы создаете анонимный подкласс LinkedHashMap, содержащий non-stati c block . Этот нестатический c блок, похожий на конструктор, будет запущен во время создания объекта. Поскольку ваш объект еще не был создан, ваша переменная "car go" не будет существовать. В нестатичном c блоке, аналогично конструктору, вы можете использовать ключевое слово «this».

this.cargo = new LinkedHashMap<Resource, Integer>(){
    {
        this.put(new ResourceAzul(), 0);
        this.put(new ResourcePreto(), 0);
        this.put(new ResourceVerde(), 0);
        this.put(new ResourceVermelho(), 0);
    }
};

Кроме того, поскольку ваша машина go LinkedHashMap только создается, она будет опорожнить. Таким образом, вы можете упростить «putIfAbsent», чтобы просто «положить».

1 голос
/ 30 апреля 2020

Нельзя помещать объекты в машину go, пока вы не выполните инструкцию инициализации. Вызовы putIfAbsent () должны идти после:

 this.cargo = new LinkedHashMap<Resource, Integer>();
 cargo.putIfAbsent(new ResourceAzul(), 0);
 cargo.putIfAbsent(new ResourcePreto(), 0);
 cargo.putIfAbsent(new ResourceVerde(), 0);
 cargo.putIfAbsent(new ResourceVermelho(), 0);

У вас есть несколько вопросов в ваших актуальных вопросах. Чтобы ответить на вопрос о том, как напечатать содержимое LinkedHashMap, вы можете распечатать его как обычно System.out.println(this.cargo), но вам потребуется @Override метод toString() для каждого из ваших Resource объектов. В противном случае вызов toString() для них по умолчанию просто напечатает имя класса и ссылку на память.

0 голосов
/ 30 апреля 2020

Если вы хотите использовать этот стиль инициализации, не пишите cargo. перед всеми putIfAbsent() вызовами. cargo все еще нулевой в этой точке.

this.cargo = new LinkedHashMap<Resource, Integer>(){
    {
        putIfAbsent(new ResourceAzul(), 0);
        putIfAbsent(new ResourcePreto(), 0);
        putIfAbsent(new ResourceVerde(), 0);
        putIfAbsent(new ResourceVermelho(), 0);
    }
};

Это соответствует тому, как вы только что написали add(), а не crewMembers.add() выше.

Кроме того, учитывая, что это совершенно новая карта, было бы проще просто позвонить put(). Вы знаете, что карта начинается пустой, не нужно putIfAbsent().

this.cargo = new LinkedHashMap<Resource, Integer>(){
    {
        put(new ResourceAzul(), 0);
        put(new ResourcePreto(), 0);
        put(new ResourceVerde(), 0);
        put(new ResourceVermelho(), 0);
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...