2016-09-10 9 views
0

Я делаю программу на 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.

Не могли бы вы помочь мне найти то, что я сделал неправильно здесь?

ответ

0

Проверьте это: https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#substring%28int,%20int%29

Когда запись начинается с 0003, record.substring(0,3); вернет 000, а не 0003. Вы должны использовать record.substring(0,4);, чтобы получить идентификатор.

+0

Большое вам спасибо :) – useruser123

+0

Просто попробовал еще раз. Он находит все записи, кроме первого - я не уверен, почему. – useruser123

 Смежные вопросы

  • Нет связанных вопросов^_^