从堆栈中删除项目 - Java

时间:2015-02-12 16:21:01

标签: java iterator stack

我有一个不同颜色的堆栈,表示为字符串。我需要做的是从标签中删除某种颜色。我考虑过创建一个空堆栈,将项目从初始堆栈弹出到此堆栈(颜色除外),然后再次弹出这些项目以获得正确的顺序。我不确定如何弹出项目并将它们放在新的堆栈中以及如何删除某个项目。谢谢。这是我到目前为止的代码。

import java.util.Collections;
import java.util.ListIterator;
import java.util.Scanner;
import java.util.Stack;

class CandiesStack{
//Methods to be used by stack

public static void showStack(Stack<String> candies){
    int num = 1;
    ListIterator<String> it = candies.listIterator(candies.size());
    while(it.hasPrevious()){
        System.out.println("Candy #" + num +" " + it.previous());
        num++;
    }
}

public static void removeYellow(Stack<String> candies){
    //Temporary Stack
    Stack<String> temp = new Stack<String>();       
    ListIterator<String> it = candies.listIterator(candies.size());

    while(it.hasNext()){
        String p = it.next();
            if(p.equals("yellow")){
                it.remove();
            }
    }
}
}

public class PezStack {

public static void main(String[] args) {
    System.out.println("--------------------------------------------------------------------------------------------------------");
    System.out.println("Welcome to PEZ Application using Stack");
    System.out.println("--------------------------------------------------------------------------------------------------------");
    Scanner kb = new Scanner(System.in);
    System.out.println("Here is the content of your PEZ container");
    System.out.println("--------------------------------------------------------------------------------------------------------\n");
    Stack<String> candies = new Stack<String>(); //Initial stack
    //Initiate the candies present in stack
    candies.push("yellow");
    candies.push("green");
    candies.push("pink");
    candies.push("orange");
    candies.push("green");
    candies.push("yellow");
    candies.push("yellow");
    candies.push("pink");
    candies.push("green");
    candies.push("yellow");
    candies.push("pink");
    candies.push("orange");
    Collections.shuffle(candies); //Shuffle content of the stack

    System.out.println("Current Pez Container");
    System.out.println("--------------------------------------------------------------------------------------------------------");

    CandiesStack.showStack(candies);

    System.out.println("Current Pez Container after remove yellow");
    System.out.println("--------------------------------------------------------------------------------------------------------");

    CandiesStack.removeYellow(candies);
    CandiesStack.showStack(candies);
}
}

3 个答案:

答案 0 :(得分:0)

根本不需要临时堆栈。您遇到的问题是您在ListIterator中错误地构建了removeYellow()

在这里构建迭代器时:

ListIterator<String> it = candies.listIterator(candies.size());

您正在使用ListIterator<E> listIterator(int index)方法,

  

从列表中的指定位置开始,返回此列表中元素的列表迭代器(按正确顺序)。指定的索引指示初始调用next时将返回的第一个元素。对previous的初始调用将返回指定索引减去1的元素。

这意味着您所做的迭代器是从堆栈中数据的 end 开始的,因此您对it.hasNext()的第一次调用将是 false < /强>

当您要使用的是public ListIterator<E> listIterator()方法时,

  

返回此列表中元素的列表迭代器(按正确顺序)。

然后您可以使用迭代器查看数据并删除所有“黄色”条目,如下所示:

public static void removeYellow(Stack<String> candies) {
    ListIterator<String> it = candies.listIterator();

    while (it.hasNext()) {
        String p = it.next();
        if (p.equals("yellow")) {
            it.remove();
        }
    }
}

答案 1 :(得分:0)

虽然我很难在洗牌时看到使用堆栈的原因,然后通过ramdomly访问它,这样就可以删除所有_yellow_s:

public static void removeYellow(Stack<String> candies) {
    while(candies.remove("yellow"));
}

我建议使用列表(例如ArrayList)来设置所需的糖果,并从该列表中构建堆栈new Stack<String>(list);

答案 2 :(得分:0)

为什么不使用

stack.remove("yellow")

虽然看起来对象不一样(两个不同的字符串具有相同的值),但 Stack 实际上使用方法等于来比较它们。因此,使用字符串以及其他任何可与等于进行比较的内容都很容易。

编辑: 好的,我现在明白了。 所以你可以这样做:

while (stack.remove("yellow"))