Целые числа двоичного поиска из текстового файла в Java

1

У меня есть отсортированный список целых чисел в txt файле (он общедоступен в Интернете), и мне нужно попросить пользователя указать номер для поиска в этом списке целых чисел через двоичный поиск.

Я вошел в курс алгоритмов, и я новичок в Java.

С кодом, который у меня есть, я получаю следующие ошибки:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 52, Size: 22
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at BinSearch4.main(BinSearch4.java:67)

* Цикл while (перечисленный ниже) является линией 67

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

/*  Binary Search Algorithm
 * 
 * - Import a sorted list of integers of an unknown length
 * 
 * - Ask the user for a number to search for (searchValue)
 * 
 * - Run a Binary Search on the list of integers without simply using binarySearch
 * 
 * - Return the index of an occurrence of the search number (searchValue)
 * 
 * - Or -1 if the target is not found.
 * 
 * 
 */


import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.util.Scanner;
import java.util.ArrayList;

public class BinSearch4 {

public static void main(String[] args) throws IOException {

    URL url = new URL("http://m.uploadedit.com/ba3a/1423978916244.txt"); 
    ArrayList<Integer> arrList = new ArrayList<Integer>(); 
    int searchValue;
    int low;
    int high;
    int mid;
    int NOT_FOUND = -1;
    Scanner in = new Scanner(System.in);

    System.out.println("Enter your number to search for:");
    searchValue = in.nextInt(); 
    System.out.println(searchValue);

    try {

        Scanner scr = new Scanner(url.openStream()); 

        while (scr.hasNextLine()) {
            int i = scr.nextInt();
            arrList.add(i);
        }
        scr.close();
        System.out.println(arrList);


    }

    catch (FileNotFoundException e) {
        e.printStackTrace();
    }




    low = arrList.get(0);                      
    System.out.println(low);
    high = arrList.get(arrList.size() - 1);
    System.out.println(high);
    mid = (low + high) / 2;

    while (low <= high && arrList.get(mid) != searchValue) {
        if (arrList.get(mid) < searchValue) {
            low = mid + 1;
        } else  {
            high = mid - 1;
        }
        mid = (low + high) / 2;
    }
    if (low > high) {
        mid = NOT_FOUND;
    }
    System.out.println(mid);

 }
}

Список номеров в текстовом файле: [-2, 3, 6, 9, 11, 22, 24, 31, 35, 43, 48, 52, 62, 65, 69, 70, 73, 83, 86, 90, 100, 107]

  • 0
    Пожалуйста, BinSearch4.java строку № 67 в файле BinSearch4.java .
  • 0
    Лучший способ решить эту проблему самостоятельно и научиться быстро решать подобные проблемы в будущем - овладеть навыком отладки. Здесь есть 2 основных навыка: 1) научиться добавлять операторы регистрации 2) научиться использовать инструмент отладчика. Для 1 попробуйте вывести на экран значения low, high, mid, arrList.get (low), arrList.get (high), arrList.get (mid) на каждой итерации. Вы увидите, как ведет себя ваша программа, и сразу увидите, когда именно она пошла не так. Для 2 просто используйте IDE и пошагово просматривайте свою программу, просматривая переменные.
Показать ещё 2 комментария
Теги:

3 ответа

0
Лучший ответ

Двоичный поиск

public class BinarySearch {

    public int binarySearch(int[] a) {
        int start = 0;
        int end = a.length - 1;
        int searchedValue = 70;

        for (int i = 0; i <= a.length; i++) {
            int mid = (start + end) / 2;

            if (searchedValue == a[mid]) {
                return 1;
            }

            if (searchedValue < a[mid]) {
                end = mid - 1;
            } else {
                start = mid + 1;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        int a[] = { 2, 5, 40, 50, 60, 70 };
        BinarySearch binarySearch = new BinarySearch();
        System.out.println(binarySearch.binarySearch(a));
    }
}

start должно быть 0, а end - arr.length-1

0

Благодаря android_dev и almas здесь они оба были правильными.

Здесь, в этом месте в моем исходном коде, размещенном здесь:

low = arrList.get(0);                      
System.out.println(low);
high = arrList.get(arrList.size() - 1);

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

Мой правильный код, который теперь работает:

low = 0;                          
System.out.println(low);
high = arrList.size() - 1; 
0

Измените свои строки:

low = arrList.get(0);                      
System.out.println(low);
high = arrList.get(arrList.size() - 1);

к

low = 0;                      
System.out.println(low);
high = arrList.size() - 1;

Причина, по которой вы получаете исключение, состоит в том, что если у вас есть 10 элементов в вашем списке и вы говорите, что у вас есть 100 - 110 в качестве элементов в списке, вы пытаетесь получить доступ к элементу списка по индексу, т.е. 100, который не существует в вашем списке в качестве списка содержит только 10 элементов, т.е. доступ к элементам за пределами индекса 9 (поскольку индекс массива начинается от 0 до n-1), вы получите IndexOutOfBoundsException.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню