Последовательный поиск по массиву строк в Java - PullRequest
0 голосов
/ 16 февраля 2012

Я должен написать последовательный / линейный поиск в массиве String. Я очень близок к завершению, но часть задания смущает меня. Это говорит о том, что нужно сравнивать целевой элемент с последовательным элементом списка, пока цель не совпадет или цель не будет меньше , чем текущий элемент массива. Как может String быть больше или меньше, чем другой элемент, когда нет числового значения? Может быть, я просто не думаю об этом правильно. Вот моя программа:

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

Любая помощь в понимании назначения и исправления исключения будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 16 февраля 2012
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 голосов
/ 16 февраля 2012

Исключение 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++) 

предотвратить исключение.Теперь я не уверен, что это решит всю вашу проблему, но исключение, конечно.

...