Как распечатать список массивов, используя переменную, содержащую имя списка массивов

Я знаю, это звучит немного глупо, но я расширяю текстовую игру и пытаюсь найти способ распечатать предметы, которые находятся в комнате. Я сделал массивList для комнаты и добавил в него «Item», используя отдельный класс с именем Item.

import java.util.ArrayList;
import java.util.List;
public class Item
{
    private String itemName;
    private Boolean pickUp;
    private Integer itemWeight;

    /**
     * Constructor for objects of class Items
     */
    public Item(String itemName, Boolean pickUp, Integer itemWeight)
    {
        this.itemName = itemName;
        this.pickUp = pickUp;
        this.itemWeight = itemWeight;
    }

    /**
     * Returns the name of the item
     */
    public String getItemName()
    {
        return itemName;
    }
    
    /**
     * Returns the pickUp ability of the item
     */
    public Boolean getPickUp()
    {
        return pickUp;
    }
    
    /**
     * Returns the weight of the item
     */
    public Integer getItemWeight()
    {
        return itemWeight;
    }
}

Часть, на которой я сейчас застрял, — это печать этих элементов при входе в комнату. В коде есть функция, которая отслеживает текущую комнату, и я пытаюсь использовать эту функцию, чтобы распечатать элементы массива соответствующих комнат. Каждая комната в игре является объектом из класса "Комната".

public class Room  {
    private String description;
    private String listName;
    private HashMap<String, Room> exits;        // stores exits of this room.

    public Room(String description, String listName) 
    {
        this.description = description;
        this.listName = listName;
        exits = new HashMap<>();
    }

    public String getListName()
    {
        return listName;
    }
    private void createRooms()
    {
        Room playground, assemblyHall, groundHallway, lunchHall, ITRoom, groundToilets, headteacherOffice, footballCage, stairs, groundClassroom, firstFloorClassroom, exitGate;
      
        // create the rooms
        assemblyHall = new Room("in the assembly hall", "assemblyHallList");
        playground = new Room("in the main playground of the school", "playgroundList");
        .......
        currentRoom = assemblyHall;
        ArrayList<Item> assemblyHallList = new ArrayList<Item>();
        assemblyHallList.add(new Item("Piece of paper", true, 1));

Эти последние 2 строки являются примером того, что я буду делать для каждой комнаты с большим количеством предметов. Я чувствую, что делаю это неправильно, но это была единственная идея, которая у меня была. У меня проблема с распечаткой элементов, когда я вхожу в комнату, так как мне нужно будет вызвать метод, чтобы получить имя arrayList, а затем использовать это имя, чтобы затем получить доступ к списку и распечатать элементы в нем, но у меня нет идея, как использовать строку для доступа к массиву, как мне пришлось бы использовать

currentRoom.getListName()

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

Я не вижу List<Item> itemList в Room, вы уже добавили это?

f1sh 24.11.2022 00:59

Мне кажется, вы путаете то, что существует в исходном коде, например «имена переменных», с тем, что существует во время выполнения, например «конкретный текст, содержащийся в строке прямо сейчас».

access violation 24.11.2022 01:01
getListName возвращает простую строку, которую вы назначили при создании Room. Создайте еще один метод, например getItemList, который возвращает список элементов в виде строки.
f1sh 24.11.2022 01:01

да, это проблема, я не могу понять, как использовать возвращенное имя списка, чтобы затем распечатать список элементов

bruh 24.11.2022 01:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы создаете ArrayList<Item> assemblyHallList, затем создаете

Room assemblyHall = new Room("in the assembly hall", "assemblyHallList");

И теперь вы ожидаете, что в этой комнате есть какая-то ссылка на Список.

Это не так работает. Комната теперь имеет значение String «assemblyHallList» в поле listName. Но ссылки на Список нет. А поскольку assemblyHallList является локальной переменной в вашем методе createRooms, ее невозможно разрешить.

Решение таково: не присваивайте имя переменной списка комнате (почему это сработает?), вместо этого назначайте сам список:

List<Item> assemblyHallList = ...;
Room assemblyHall = new Room("in the assembly hall", assemblyHallList);

Конечно, вам нужно изменить тип параметра конструктора и поля listName комнаты на List<Item>.

Ответ принят как подходящий

Чтобы ответить на ваш вопрос, вы не можете просто напрямую получить доступ к переменной из строки, содержащей ее имя. Технически вы можете сделать static Hashmap<String, ArrayList<Item>>, чтобы отслеживать все списки и получать к ним доступ по имени.

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

Что-то вроде этого будет работать лучше:

ArrayList<Item> items = new ArrayList<>();
items.add(new Item("Piece of paper", true, 1));
Room room = new Room("best room", items);
public class Room  {
    private String description;
    private ArrayList<Item> items;
    private HashMap<String, Room> exits;

    public Room(String description, ArrayList<Item> items) 
    {
        this.description = description;
        this.items = items;
        exits = new HashMap<>();
    }

    // Other members not shown
}

Другие вопросы по теме

Похожие вопросы

SetState не обновляет пользовательский интерфейс, даже если переменная не объявлена ​​​​в методе сборки
Объединение оператора assert и сопоставления с образцом instanceof
Как использовать «extend» в Java-программе?
Primefaces 10+ Datatable как получить отсортированный столбец из SortEvent?
GROUP BY-Like запрос в DynamoDB с DynamoDbEnhancedClient
Mockito ArgumentMatcher, чтобы проверить, содержится ли значение arg в определенной коллекции
Spring Data MongoDB – как обновить с помощью @Update, не устанавливая для большинства полей значение null?
Какой EIP использовать: получить конфигурацию по содержимому сообщения, отображению, фильтрации и OAuth, а затем отправить, повторить попытку отправки только части
Java.lang.NoClassDefFoundError: исключение javax/activation/DataSource, когда я пытаюсь отправить электронное письмо в своем приложении Java Swing
Как сделать так, чтобы дочерний проект Maven имел версию, отличную от родительской?