2012-02-15 4 views
0

Я должен написать последовательный/линейный поиск в массиве String. Я очень близок к финишу, но часть задания меня смущает. Он говорит, что сравнить целевой объект с последующим элементом списка до тех пор, пока цель или цель не будет равна , менее, чем текущий элемент массива. Как строка может быть больше или меньше, чем другой элемент, когда нет числового значения? Возможно, я просто не думаю об этом правильно. Вот моя программа до сих пор:Последовательный поиск в массиве String в 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

Для справки: вы не можете сравнивать значения String с помощью == и! =, Это не работает (оно сравнивает только «адреса» объектов). Вы должны использовать string1.equals (string2) – huelbois

+0

Используйте 'String # compareTo' для сравнения строк. Вот связанный с этим вопрос, который объясняет больше: http://stackoverflow.com/questions/4064633/string-comparison-in-java. –

+0

Что касается запроса «меньше», Java String реализует Comparable. Когда вы вызываете Comparable.compareTo() для сравнения объекта с другим, возвращаемое значение указывает на относительный естественный порядок объектов. В случае с Строками естественный порядок лексикографичен. –

ответ

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

Вероятно, вызывает ArrayIndexOutOfBoundsException.

Ваши условия проверки i < numbers.length. Поэтому вы устанавливаете границы. Однако если i == numbers.length - 1, то вы попытаетесь получить доступ к i+1, который больше вашего массива, поэтому он выходит за пределы.

Например: numbers.length Адрес: 4. Таким образом, i может быть 3. С i+1 вы пытаетесь получить доступ к numbers[4], который будет пятым положением, так как начальные массивы начинаются с 0 и numbers[3] - это последняя позиция.

+0

Имеет смысл, спасибо. – Brett

0

ArrayIndexOutOfBoundsException связано с тем, вы используете:

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

и второй:

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

Я сделал то, что вы рекомендовали, и, конечно же, исключение исчезло, и программа запустилась, однако есть одна проблема. Я тестировал каждый элемент, а первый и последний («Ада» и «Джоан») возвращают неудачу, даже если они действительно находятся в списке. Есть ли способ исправить это? – Brett

+0

Только что заметил другие комментарии выше ... попробует их. – Brett