#java #vector #stack
#java #вектор #стек
Вопрос:
Мне нужно использовать stack для создания списка, хранящего объекты, и я пытаюсь найти в API, однако я понятия не имею, на какой синтаксис я должен ссылаться.
Вот мой код:
public class Rock {
public String name;
public Rock(String name){
this.name=name;
}
}
public class RockTest{
public static void main(String[] args){
Rock r1 = new Rock("eluanshi");
Rock r2 = new Rock("jingangshi");
Rock r3 = new Rock("dalishi");
Stack(r1,r2,r3); // this is obviously wrong but how can i deal with it
}
}
Комментарии:
1. «Мне нужно использовать stack для создания списка, хранящего объекты» Ну, тебе нужен a
Stack
, или aList
?. Выберите один.2. Не переходите на язык, делая случайные вещи. Следуйте инструкциям и поймите, что вы делаете.
3. Это Java, а не C . Пожалуйста, следуйте инструкциям. Вы можете начать с официальных руководств по Java .
4. если вы используете stack, создайте экземпляр нового стека и используйте метод
stack.push(Object)
, если используете List, создайте экземпляр ArrayList и используйтеlist.add(Object)
5. @CommuSoft конечно, но это Java, а не другой язык программирования :).
Ответ №1:
Stack — это универсальный тип, и у него есть только конструктор без аргументов. Вам нужно, чтобы push
ваши данные в стеке:
Stack<Rock> stack = new Stack<Rock>();//use new Stack<>() in Java 7 (diamond inference)
stack.push(r1);
stack.push(r2);
stack.push(r3);
Это приведет к стеку с r3
on top. Вы можете отменить push
инструкции, если хотите r1
сверху.
Generics ( <>
часть) определяет тип элементов, которые будет содержать ваш стек. Если вы используете Rock
(как в приведенном выше примере), вы можете только помещать камни в стек. Однако преимущество заключается в том, что вы уверены, что когда вы pop
используете элемент, это камень. Если вы, например, хотите создать стек с несколькими элементами ( String
, …), вы можете использовать object:
Stack<Object> stack = new Stack<>();
stack.push(r1);//rock at the bottom
stack.push("Second item");
stack.push(r2);
stack.push((Integer) 2);
stack.push("Four elements already");
stack.push(r3);
Недостатком этого, конечно, является то, что вы не можете определить во время компиляции тип элемента, который вы будете извлекать из стека.
Вы можете выполнить итерацию с Stack
помощью Stack<T>.iterator
метода:
Stack<Rock> stack = new Stack<Rock>();
stack.push(r1);
stack.push(r2);
stack.push(r3);
Iterator<Rock> iter = stack.iterator();
while(iter.hasNext()) {
Rock r = iter.next();
//do something with the current rock
}
В современных версиях Java (вероятно, начиная с Java 7) вы можете использовать foreach-construct:
Stack<Rock> stack = new Stack<Rock>();
stack.push(r1);
stack.push(r2);
stack.push(r3);
for(Rock r : stack) {
//do something with the current rock
}
Обратите внимание, что итератор для стека работает сверху вниз. r3
Сначала будет повторяться So.
Комментарии:
1. Оператор diamond
<>
был введен в Java 7, а не в Java 5. Но в остальном хороший ответ!2. Действительно, извините, иногда я путаю версии языков программирования. Исправит это. Спасибо.
3. @CommuSoft содержимое под horizon очень полезно, кстати, как мне выполнить итерацию по стеку? также используя метод итератора? Но, похоже, я получаю только имя класса пакета @ hashcode