Изменение значения элемента в ArrayDeque
Теперь у меня проблема с указанным элементом ArrayDeque.
Storages.add(new Storage("Furniture storage", 5, 58));
Первый тип хранения. Следующий - этаж, а последний - doorNumber.
Теперь я хочу изменить конкретный элемент ArrayDeque Floor
к другому.
Например, из второго пункта списка
Meat storage 1 18
в
Meat storage 7 18
есть мой основной класс
ArrayDeque<Storage> Storages = new ArrayDeque<Storage>();
Storage storage_obj = new Storage();
Storages.add(new Storage("Furniture storage", 5, 58));
Storages.add(new Storage("Meat storage", 1, 18));
Storages.add(new Storage("Hardware storage", 4, 41));
Storages.add(new Storage("Technique storage", 2, 27));
Storages.add(new Storage("Vegetable storage", 8, 88));
Storages[1] = storage_obj.setFloor(7);
System.out.println("Whole storages list");
outputStorages(Storages);
Есть класс хранения
public class Storage {
private String type;
private int floor;
private int doorNumber;
public Storage(){
this("------", 0,0);
}
public Storage(String type_t, int floor_t, int doorNumber_t){
type = type_t;
floor = floor_t;
doorNumber = doorNumber_t;
}
void setType(String type){
this.type = type;
}
String getType(){
return this.type;
}
void setFloor(int floor){
this.floor = floor;
}
int getFloor(){
return this.floor;
}
void setDoorNumber(int doorNumber){
this.doorNumber = doorNumber;
}
int getDoorNumber(){
return this.doorNumber;
}
}
Ps Не судите меня за мою грамматику, английский не мой родной язык ^^
2 ответа
Есть несколько проблем с вашим кодом. Я постараюсь комментировать их шаг за шагом:
ArrayDeque<Storage> Storages = new ArrayDeque<Storage>();
1) Есть ли причина, почему вы используете ArrayDeque? Вам нужно поведение с двусторонней очередью? Или вам просто нужна коллекция? В последнем случае я бы предложил использовать ArrayList.
2) Соглашение об именах для языка программирования Java указывает, что всегда следует начинать со строчного символа для переменных.
3) Хорошей практикой является использование только типа интерфейса для объявлений переменных (а также параметров и методов), поэтому вы должны четко определить, какой интерфейс вы будете использовать.
Подводя итог, я бы написал:
Collection<Storage> storages = new ArrayList<Storage>();
Следующий...
Storages[1] = storage_obj.setFloor(7);
Это не компилируется. Ваш класс Storage объявляет метод setFloor со следующей подписью:
void setFloor(int floor)
Это означает, что ваш метод setFloor ничего не возвращает; таким образом, ничто не может быть назначено.
Кроме того, переменная Storages
это не массив. Таким образом, вы не можете получить доступ к первому элементу, используя скобки []
,
Что на самом деле работает, так это следующий код, с помощью которого вы можете изменить первый элемент в коллекции:
storages.get(0).setFloor(7);
Обратите внимание, что я уже использовал переименованную переменную.
Что-то еще: Ваш класс Storage объявляет конструктор без параметров, который устанавливает некоторые значения по умолчанию. Хорошей практикой также является принуждение пользователей таких классов передавать разумные значения. Поэтому я предлагаю удалить конструктор без параметров, просто оставив другой, который, в свою очередь, должен выполнить некоторые проверки входящих аргументов (например, проверить тип на отсутствие null
).
Вы можете сделать это так.
for (Iterator iter = Storages.iterator(); iter.hasNext();) {
Storage o = (Storage)iter.next();
if (o.getFloor() == 1 && o.getDoorNumber() == 18) {
o.setFloor(7);
}
System.out.println(o);
}
Но, как упоминалось @johnchen902, ArrayDeuque не является подходящей коллекцией для элементов произвольного доступа.