Нужна помощь с бинарным поиском - PullRequest
0 голосов
/ 06 октября 2009

В этом году я пытаюсь работать впереди в своем классе алгоритмов: D, и я делаю работу в классе (поэтому она не помечена или не оценена как таковая, но только для практики, я полагаю, приведу к части курсовой работы)

В любом случае - нам дали список имен в виде текстового файла, который принимает следующий формат

"surname, first name"

и каждому предмету присваивается номер записи (который на данный момент не актуален)

мы должны переписать метод поиска, используя пример полу псевдокода, который он дал нам, где я застреваю. (первоначально метод поиска массива был следующим)

/**
 * Look a name and return the number or null if there is no match
 */
public String search(String name)
{
    for (int i = 0; i < length; i++) {
        if (name.equals(list[i].getName())) {
            return list[i].getNumber();
        }
    }
    return null;
}

Текстовое описание из слайдов лекции говорит о том, что мы можем сделать реализацию следующим образом;

1) Use variables to store the start-index and length of the sequence of array elements that must contain this entry if there is one.
2) Set start-index to 0 and length to the array length.
3) while length is greater than 1 
a) Compare Mike with the name in the middle element (at start_index + length/2)
b) If it is earlier then set length to length/2 and leave start-index as it is.
c) If it is later or equal then add length/2 to start-index and subtract length/2 from length
4) length is now 1 so it must be Mike's entry if he has one

Здесь моя реализация, но я получаю исключение нулевого указателя на

java.lang.NullPointerException
    at PhoneBook.search(PhoneBook.java:73) (if(name.comeToIgnoreCase... )
    at PhoneBook.testSearch(PhoneBook.java:57)

public String search (String name)
    {
        int startIndex = 0;
        int length = list.length;

        while(length > 1){
            if(name.compareToIgnoreCase(list[startIndex + (length / 2)].getName()) > 0) {
                length = length / 2;
            }
            else {
                startIndex = startIndex + (length / 2);
                length = length - (length / 2);
            }
            if (length == 1){
                return list[length].getName();
            }
        }

        return null;
    }

Ответы [ 2 ]

1 голос
/ 06 октября 2009

Ну, name может быть нулевым, или list может быть нулевым, или list[startIndex + (length / 2)] может быть нулевым, поэтому вставьте проверки для всех них перед строкой 57:

if (null == name)  throw new NullPointerException ("name is null");
if (null == list)  throw new NullPointerException ("list is null");
if (null == list[startIndex + (length / 2)]) {
    throw new NullPointerException ("list[" + (startIndex + (length / 2)) + "] is null");
}

Когда вы знаете, какой из них равен нулю, вы можете начать исследовать, почему он равен нулю.

Кстати (не имеет отношения к вашему вопросу) этот код из вашего метода содержит две ошибки:

if (length == 1){
    return list[length].getName();
}
0 голосов
/ 12 декабря 2010

Если предположить, что код соответствует заданному, и NPE добавляется в search, то only , возможно, объяснение состоит в том, что один из входных данных для метода search является недействительным:

  • name - null,
  • list - это null или
  • один из элементов list является null.

Итак, вам нужно взглянуть на код, который вызывает search для определения основной причины.

(Это не означает, что search обязательно является правильным. Но сначала вам нужно решить проблему, описанную выше.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...