2012-01-19 78 views
1

我是编程新手,如果此问题很简单,请接受我的道歉。按字母顺序搜索名称的堆栈

我的老师要我们来创建搜索自带首字母顺序排列的名称的堆栈,并返回其

的方法。例如:如果我有我的筹码这些名字:

老虎伍兹,杰克尼古拉斯,阿诺德·帕尔默,杰克·尼古拉斯,吉米Demerrit,杰克尼古拉斯,萨姆·斯尼德,吉米Demerrit,本·霍根,沃尔特·哈根,托米装甲,鲍比 - 琼斯

的方法应该返回阿诺 - 帕尔默

这里是我的代码:

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; 
} 

的程序在一个无限循环中得到

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

预先感谢您

回答

0

迭代收集和返回搜索元素。

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

谢谢你,我插入此代码,以我的程序和它的工作正常非常感谢你 – skoon 2012-01-19 01:32:54

1

对于无限循环:当您测试name.charAt(0) == letter时,如果这是真的,则不会从names堆栈弹出,因此您将继续运行该实例(并推入并推入temp)。

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

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

0

如果您需要保留堆栈,您应该先将其复制,但这会找到按字母顺序排列的最小名称。

public String findFirst() { 

     String name = null; 
     while(!names.isEmpty()) { 
      if(names.peek().compareTo(name) < 0) { 
       name = names.pop(); 
      } else { 
       names.pop(); 
      } 
     } 
     return name; 
} 
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