2012-02-15 53 views
0

我應該在字符串數組上編寫順序/線性搜索。我很接近完成,但部分任務讓我困惑。它說比較目標項目與列表的連續元素,直到目標匹配或目標是小於比數組的當前元素。當沒有數值時,字符串如何能比另一個元素更多或更少?也許我只是沒有正確地考慮它。這是我的計劃至今:在Java中的字符串數組上的順序搜索

public class SequentialSearchString { 
public static boolean sequential (String[] numbers){ 
    //Set the target item to an arbitrary String that should return true. 
    String T1 = "Frank"; 

    for (int i = 0; i < numbers.length; i++){ 
     if (numbers[i] == T1){ 
      return true;  
     } 
     if (numbers[i] != T1){ 
      numbers[i] = numbers[i+1]; 
     }   
    } 
    return false; 
} 

public static boolean sequential2 (String[] numbers){ 
    //Set the target key to String that should return false. 
    String T2 = "Ian"; 
    for (int i = 0; i < numbers.length; i++){ 
     if (numbers[i] == T2){ 
      return true;  
     } 
     if (numbers[i] != T2){ 
      numbers[i] = numbers[i+1]; 
     } 
    } 
    return false; 
} 


public static void main(String[] args) { 
    //Create a list of 8 Strings. 
    String [] numbers = 
{"Ada", "Ben", "Carol", "Dave", "Ed", "Frank", "Gerri", "Helen", "Iggy", "Joan"}; 
    //If the first target item (T1) is found, return Succuss. If not, return failure. 
     if (sequential(numbers) == true){ 
      System.out.println("Success. 'T1' was found"); 
     } 
     else { 
      System.out.println("Failure. 'T1' was not found"); 
     } 
    //If the second target item (T2) is found, return Succuss. If not, return failure. 
     if (sequential2(numbers) == true){ 
      System.out.println("Success. 'T2' was found"); 
     } 
     else { 
      System.out.println("Failure. 'T2' was not found"); 
     } 
    } 
} 

第一種方法工作正常,但我似乎具有搜索不在列表中的元素的問題。這裏是我運行程序後得到的錯誤信息:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10 
at SequentialSearchString.sequential2(SequentialSearchString.java:32) 
at SequentialSearchString.main(SequentialSearchString.java:50) 
Success. 'T1' was found 

任何幫助理解分配和修復異常將不勝感激。

+0

有關信息:您無法使用==和!=來比較字符串值,但它不起作用(它僅比較對象的「地址」)。你必須使用string1.equals(string2) – huelbois 2012-02-15 22:50:08

+0

使用'String#compareTo'來比較字符串。這裏有一個相關的問題解釋更多:http://stackoverflow.com/questions/4064633/string-comparison-in-java。 – 2012-02-15 22:55:07

+0

對於「少於」請求,Java String實現了Comparable。當您調用Comparable.compareTo()以將一個對象與另一個對象進行比較時,返回值指示對象的相對自然順序。在字符串的情況下,自然順序是詞典。 – 2012-02-15 23:01:43

回答

1
numbers[i] = numbers[i+1]; 

很可能會導致您的ArrayIndexOutOfBoundsException

您的條款檢查i < numbers.length。所以你設定了界限。但是,如果i == numbers.length - 1那麼你會嘗試訪問i+1這是大於你的數組,因此它是越界。例如:是4。所以i可以是 3。用i+1您嘗試訪問numbers[4]這將是第五個位置,因爲數組以0numbers[3]開頭將是最後一個位置。

+0

有道理,謝謝。 – Brett 2012-02-15 23:15:47

0

的ArrayIndexOutOfBoundsException異常是由於您使用的事實:

for (int i = 0; i < numbers.length; i++) 

和後者:

numbers[i] = numbers[i+1]; 

當我等於numbers.length-1(最後一次迭代),I + 1等於號。長度。然後嘗試讀取錯誤的數字[numbers.length](有效索引從0到numbers.length-1)。

你必須使用:

for(int i=0;i<numbers.length-1;i++) 

防止異常。現在,我不確定它會解決你的整個問題,但肯定是異常。

+0

我做了你的建議,果然異常消失了,程序運行,但是有一個問題。我測試了每個元素,第一個和最後一個(「Ada」和「Joan」)返回失敗,即使它們實際上在列表中。有沒有辦法解決這個問題? – Brett 2012-02-15 23:17:17

+0

剛剛注意到上面的其他評論...會嘗試這些。 – Brett 2012-02-15 23:18:14