在堆栈中搜索按字母顺序排在第一位的名称

时间:2012-01-19 01:09:27

标签: java

我是编程新手,所以如果这个问题很简单,请接受我的道歉。

我的老师希望我们创建一个方法,在堆栈中搜索首先按字母顺序排列的名称并将其返回

例如:如果我的堆栈中有这些名称:

老虎伍兹,杰克尼古拉斯,阿诺德帕尔默,杰克尼古拉斯,吉米德梅里特,杰克尼古拉斯,萨姆斯内德,吉米德梅里特,本霍根,沃尔特哈根,汤米阿莫尔,鲍比琼斯

该方法应该返回Arnold Palmer

这是我的代码:

public String findFirst() {
        System.out.println("findFirst" );

        Stack<String>temp = new Stack<String>();

        char letter = 'A';
        String name = null;

        while(!names.isEmpty()) {
            name = names.peek();

            if(name.charAt(0) == letter) {
                temp.push(name);
                name = names.peek();
            } else {
                temp.push(name);
                names.pop();
            }
        }

        while(!temp.isEmpty()) {
            names.push(temp.pop());
        }

        return name;
}

程序进入无限循环

请帮助我,因为我需要知道如何为我的程序修复它

提前谢谢

4 个答案:

答案 0 :(得分:1)

对于无限循环:当你测试name.charAt(0) == letter时,如果这是真的,你就不会从names堆栈中弹出,所以你将继续运行到那个实例(并推动和推进temp)。

请注意,单独修复它不会使它像您想要的那样工作。例如,您应该发现您永远不会更新letter的值。

另外,你不应该指望只看第一个字母就足够了。如果您想根据字母顺序比较两个字符串,可以在.compareTo s上使用String方法。

答案 1 :(得分:0)

如果你需要保留堆栈,你应该先复制它,但这会找到字母最小的名称。

public String findFirst() {

        String name = null;
        while(!names.isEmpty()) {
            if(names.peek().compareTo(name) < 0) {
                name = names.pop();
            } else {
                names.pop();
            }
        }
        return name;
}

答案 2 :(得分:0)

迭代集合并返回搜索元素。

 for(String s:names)
 {
  if(s.startsWith("c")) // or if(s.charAt(0)==letter)
     {
      return s;
      }
 }
 return null;

答案 3 :(得分:0)

可能是你误解了老师的意思。

参考代码:

import java.util.Collections;
import java.util.Comparator;
import java.util.Stack;

public class StackTest {
public static void main(String[] args) {
    Stack<String> stack = new Stack<String>();
    stack.push("Tiger Woods");
    stack.push("Jack Nicholas");
    stack.push("Arnold Palmer");
    stack.push("Jack Nicholas");
    stack.push("Jimmy Demerrit");
    stack.push("Jack Nicholas");
    stack.push("Sam Sneed");
    stack.push("Jimmy Demerrit");
    stack.push("Ben Hogan");
    stack.push("Jimmy Demerrit");
    stack.push("Walter Hagen");
    stack.push("Tommy Armor");
    stack.push("Bobby Jones");
    Collections.sort(stack, new Comparator<String>() {
        public int compare(String o1, String o2) {
            // the method compareTo in String class
            return o2.compareTo(o1);
        }
    });
    //the sorted stack
    System.out.println(stack);
    System.out.println(stack.pop());
   }
}

输出

// Last In First Out or First In Last Out
[Walter Hagen, Tommy Armor, Tiger Woods, Sam Sneed, Jimmy Demerrit, Jimmy Demerrit,        Jimmy Demerrit, Jack Nicholas, Jack Nicholas, Jack Nicholas, Bobby Jones, Ben Hogan, Arnold Palmer] 

Arnold Palmer