Причина, по которой я задаю этот вопрос, заключается в том, что я все еще получаю исключение нулевого указателя, даже если я уверен, что проблемы нет, но, как обычно, возможно, я допустил серьезную ошибку: D
Слайд лекции сказал это
1) Используйте переменные для хранения начального индекса и длины последовательности элементов массива, которые должны содержать запись Майка, если она есть.
2) Установите начальный индекс в 0, а длину в длину массива.
3) длина больше 1
a) Сравните Майка с именем в среднем элементе (в start_index + length / 2)
b) Если это раньше, тогда установите длину в length / 2 и оставьте стартовый индекс без изменений.
в) Если оно больше или равно, то добавьте длину / 2 к начальному индексу и вычтите длину / 2 из длины
4) длина теперь равна 1, так что, если он имеет
один.
вот мой код (меняю способ поиска в записи в телефонной книге). Просто чтобы добавить, программа загружает текстовый файл, который хранит имена и номера в следующих форматах, в отдельных строках
258132 Адамс, Аарон
199644 Адамс, Абакук
567480 Адамс, Авраам
810323 Адамс, Адам
444601 Адамс, Адлард
/**
* Write a description of class Record here.
*
* @author John Bovey
* @version 29 September 2009
*/
public class Record
{
private String name;
private String number;
public Record(String name, String number)
{
this.name = name;
this.number = number;
}
public String getName()
{
return name;
}
public String getNumber()
{
return number;
}
}
import java.io.*;
/**
* @author John Bovey
* @version 29 September 2009
*/
public class PhoneBook
{
static final int MAX_RECORDS = 50000;
private Record list[];
private int length;
/**
* Constructor for objects of class PhoneBook
*/
public PhoneBook(String file) throws FileNotFoundException
{
list = new Record[MAX_RECORDS];
BufferedReader br = new BufferedReader(new FileReader(file));
try {
String s = br.readLine();
length = 0;
while (s != null) {
String[] args = s.split(" ", 2);
list[length] = new Record(args[1], args[0]);
s = br.readLine();
length++;
}
}
catch (IOException e) {
}
}
**/**
* Look a name and return the number or null if there is no match
*/
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);
}
}
return list[startIndex + (length / 2)].getNumber();
}**
/**
* Test the search method by looking up each name in turn
*/
public void testSearch()
{
for (int i = 0; i < length; i++) {
String name = list[i].getName();
String num_correct = list[i].getNumber();
String num_search = search(name);
if (!(num_correct.equals(num_search))) {
System.out.printf("Failed for %s - search returned %s instead of %s\n", name, num_search, num_correct);
return;
}
}
System.out.println("Ok.");
}
}