Я хотел бы решить эту проблему следующим образом:
- Создайте собственный класс для отслеживания всех элементов,
ItemManager
. ItemManager
следует содержит HashMap
, что позволяет хранить <key, value>
пар. Это позволит сохранить элемент и его статус вместе. Мы будем использовать имя каждого элемента в качестве ключа (это будет строка) и статус каждого элемента в качестве значения (это будет логическое значение). Поэтому мы определяем HashMap<String, Boolean>
. Поскольку в этом HashMap
хранится имя каждого элемента, нам больше не нужно хранить их в массиве, который вы упомянули ранее (чтобы получить список всех элементов, которые мы могли бы просто использовать hashMap.keySet().toArray()
). Последнее преимущество HashMap
состоит в том, что количество элементов может расти бесконечно, вы не ограничены числом, которое вводит пользователь, как в случае с массивом. ItemManager
должны иметь запросы, позволяющие вам добавить элемент (с состоянием по умолчанию false), добавить элемент с пользовательским состоянием, проверить, существует ли элемент, и обновить состояние элемента. - Запросив, активен ли элемент, вы можете затем определите, что должен содержать текст в поле вывода.
import java.util.HashMap;
public class ItemManager {
private HashMap<String, Boolean> itemMap;
private final Boolean DEFAULT_STATUS = false;
ItemManager(){
itemMap = new HashMap<String, Boolean>();
}
// Add a new item with a given name and default status (False)
public void addItem(String name) {
itemMap.put(name, DEFAULT_STATUS);
}
// Add a new item with a given name and custom status
public void addItem(String name, Boolean status) {
itemMap.put(name, status);
}
// Check whether an item exists
public Boolean itemExists(String name) {
if (getStatus(name) == null) {
return false;
} else {
return true;
}
}
// Remove an item with given name
public void removeItem(String name) {
itemMap.remove(name);
}
// Update the status of an existing item. Note this uses the same .put method so we simply call addItem()
public void setStatus(String forItem, Boolean status) {
addItem(forItem, status);
}
// Get the status of a given item
public Boolean getStatus(String forItem) {
return itemMap.get(forItem);
}
}
Очевидно, что при использовании класса ItemManager
вам необходимо быть внимательным, чтобы проверить, существует ли элемент, прежде чем обновлять статус (в противном случае setStatus()
все равно просто создаст элемент - обратите внимание, как он вызывает addItem()
- причина этого в том, что HashMap.put()
добавляет новую пару <key, value>
, если ключ не существует в пределах HashMap
, или обновляет значение для ключа, если он существует). В идеале вы должны реализовать обработку ошибок, чтобы updateStatus()
выдавал ошибку, если элемент еще не существует, однако обработка ошибок - более продвинутая топи c, поэтому ее стоит сохранить в будущем.
Чтобы проиллюстрировать вышеизложенное, мой класс View делает следующее:
...
case "activate":
itemName = activateItemTextField.getText();
activateItemTextField.setText("");
if (itemManager.itemExists(itemName)) {
itemManager.setStatus(itemName, true);
outputLabel.setText(itemName + "(yes)");
} else {
outputLabel.setText("Item doesn't exist!");
}
break;
...
Это оставляет меня с чем-то следующим. Извиняюсь за плохой вид - прошло много времени с тех пор, как я использовал Swing и спешил.