2013-04-17 143 views
0

下面我试图创建一个方法,通过数组搜索某个字符串并返回它的位置,如果不存在,那么-1应该是返回的数字。下面我使用该方法搜索一个单词,即使该单词在数组内,它也会返回-1。为什么是这样?搜索数组中的字符串

String answer = ""; 

    System.out.println("Enter word to search within array"); 
    answer = in.next(); 


     public static int search(String[] theWords, String answer) { 
     int a = -1; 
     for(int i = 0; i < theWords.length; i++) { 
      if (answer.equals(theWords[i])){ 
       a = i; 
       break; 
      } 
     } 
     return a; 
    } 
+0

你可以直接从'if'条件本身返回'a'。 – Srinivas

+4

首先:'Arrays.asList(theWords).indexOf(answer)'是你的朋友。另一方面,您应该展示何时失败的完整示例。对我来说看起来很好(不是我写的代码,但它应该可以工作) - 所以你应该帮助我们重现问题。 –

+0

我的猜测可能是'答案'和'theWords [i]'是不同的情况。你是否尝试过'answer.equalsIgnorecase(theWords [i])'? – PermGenError

回答

1

您可以选择让数组的副本,因为排序可能对消费者的方法是不希望

public static int Search(String[] thewords, String answer) { 
    if(thewords == null) { 
     throw new NullPointerException(); 
    } 
    String[] copy = new String[thewords.length]; 
    System.arraycopy(thewords,0,copy,0,copy.length); 
    Arrays.sort(thewords);  
    return Arrays.binarySearch(thewords, answer); 
} 

注:返回-pos而不是-1

如果您需要-1

public static int Search(String[] thewords, String answer) { 
    if(thewords == null) { 
     throw new NullPointerException(); 
    } 
    String[] copy = new String[thewords.length]; 
    System.arraycopy(thewords,0,copy,0,copy.length); 
    Arrays.sort(thewords); 
    int idx = Arrays.binarySearch(thewords, answer); 
    return idx < 0? -1:idx; 
} 

关于你的代码:我相信这个问题会涉及到外壳或间隔:
更换的东西,如:if (answer.equalsIgnoreCase(theWords[i].trim())){

对于大型阵列去与二进制搜索。

+0

如果数组未被排序会怎样? – MAV

+1

binarySearch只能用于* sorted *数组 – Bohemian

+0

@Bohemian:是的.Misread the OP。修复答案。我的坏在这里 – Cratylus

4

我看不出什么毛病的代码,但我会建议取消保存返回值的局部变量:

public static int Search(String[] thewords, String answer) { 
    for (int i = 0; i < thewords.length; i++) { 
     if (answer.equals(thewords[i])){ 
      return i; 
     } 
    } 
    return -1; 
} 

有了这个简单的逻辑,还有的存在是一个很少或根本没有机会此代码中的错误。


我认为这是课程,并且您不允许使用库方法。如果你被允许,你的方法可能是一条线:

return Arrays.asList(theWords).indexOf(answer);