Я знаю, это звучит немного глупо, но я расширяю текстовую игру и пытаюсь найти способ распечатать предметы, которые находятся в комнате. Я сделал массив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()
чтобы получить имя списка, но когда я пытаюсь его распечатать, он печатает само имя, а не элементы. Любая помощь приветствуется, и я могу отправить больше частей класса, если это необходимо. Не включил все это, так как оно очень большое и многое из этого не имеет отношения к моей проблеме.
Мне кажется, вы путаете то, что существует в исходном коде, например «имена переменных», с тем, что существует во время выполнения, например «конкретный текст, содержащийся в строке прямо сейчас».
getListName
возвращает простую строку, которую вы назначили при создании Room
. Создайте еще один метод, например getItemList
, который возвращает список элементов в виде строки.
да, это проблема, я не могу понять, как использовать возвращенное имя списка, чтобы затем распечатать список элементов
Вы создаете 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
}
Я не вижу
List<Item> itemList
вRoom
, вы уже добавили это?