2012-02-15 9 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

+0

'String#compareTo'を使って文字列を比較します。ここでは詳細を説明する関連する質問があります:http://stackoverflow.com/questions/4064633/string-comparison-in-java –

+0

「より小さい」要求に関しては、Java StringがComparableを実装しています。オブジェクトを別のオブジェクトと比較するためにComparable.compareTo()を呼び出すと、戻り値はオブジェクトの相対的な自然順を示します。ストリングの場合、自然順番は辞書順です。 –

答えて

1

ArrayIndexOutOfBoundsExceptionを引き起こす可能性があります。

あなたの句はi < numbers.lengthをチェックします。あなたは境界を設定します。しかし、i == numbers.length - 1の場合は、i+1にアクセスしようとします。これは配列よりも大きいので、範囲外です。

たとえば、numbers.length4です。したがって、i3になります。 i+1を使用すると、0で始まり、numbers[3]で始まる配列が最後の位置になるので、numbers[4]にアクセスしようとすると5番目の位置になります。

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

、後者:

+0

意味があります、ありがとうございます。 – Brett

0

ArrayIndexOutOfBoundsExceptionが原因お使いの事実にある

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

私はnumbers.length-1(最後の繰り返し)に等しいとき、私+ 1が数字に等しいです。長さ次に、数値[numbers.length]を間違って読み込みます(有効なインデックスは0からnumbers.length-1までです)。

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

例外を防ぐために:

あなたは使うようになってきました。さて、私はそれがあなたの全体の問題を解決するだろうと確信していませんが、確かに例外。

+0

私はあなたのお勧めを行いましたが、例外がなくなり、プログラムが実行されていますが、問題は1つあります。私は各要素をテストし、最初と最後のもの( "Ada"と "Joan")は実際にリストに入っていても失敗を返します。私はこれを解決する方法はありますか? – Brett

+0

ちょうど上記の他のコメントに気づいた...それらを試してみましょう。 – Brett