Я делаю программу на Java, где пользователь может создавать «базы данных» (файлы .txt) с использованием файлов произвольного доступа и хранить записи там. Я работаю над реализацией двоичного поиска, чтобы дать пользователю возможность найти запись по ID.Реализация двоичного поиска в файлах случайного доступа в Java
public static String binarySearch(String fileName, String id,String data_config) throws IOException
{
RandomAccessFile Din = new RandomAccessFile(fileName, "r");
num_records = getNumOfRecords(data_config);
int Low = 0;
int High = num_records;
int Middle;
String MiddleId;
String record = "NOT_FOUND";
boolean Found = false;
while (!Found && (High >= Low))
{
Middle = (Low + High)/2;
record = getRecord(fileName,Middle,data_config);
MiddleId = record.substring(0,3);
int result = MiddleId.compareTo(id);
if (result == 0) // ids match
Found = true;
else if (result < 0)
Low = Middle + 1;
else
High = Middle -1;
}
return record;
}
Вот метод getRecord(), который работает хорошо, потому что я испытал это даже без метода BinarySearch().
Проблема заключается в методе compareTo(), используемом в binarySearch. Он всегда возвращает -1, удовлетворяя второй части инструкции if-else. Например, эти записи в одном из моих файлов:
Id Опыт Замужем Наемный промышленности
0001 1 нет 123,0 kjasdhsjhjh
0002 1 да 123,0 asdhajshjasdhja
0003 1 да 124,0 ajskjkasjd
0004 1 да 124,0 kasjdkjsdjs
0005 1 да 124.0 kajskdjaksdjkas
0006 1 да 123,0 kjksjdkasj
Если я ищу 0001:
Высокий = num_records = 5;
Низкий = 0, поэтому Средний = 5/2 = 3
Это идет к третьей записи, и она работает 0003 СотрагеТо (0001). Результатом этого сравнения является -1. Так как он меньше 0, новый Low равен Middle + 1 = 3 + 1 = 4, и он проверяет четвертую запись, даже если это не должно. Поскольку это двоичный поиск, в этом случае предполагается проверить вторую запись, поскольку 0001 меньше 0003.
Не могли бы вы помочь мне найти то, что я сделал неправильно здесь?
Большое вам спасибо :) – useruser123
Просто попробовал еще раз. Он находит все записи, кроме первого - я не уверен, почему. – useruser123