Возникли проблемы с поиском позиции в массиве с помощью бинарного поиска - PullRequest
0 голосов
/ 23 апреля 2019

У меня проблемы с поиском в моем массиве значения, введенного пользователем. Этот проект о взятии денег у ваших друзей и инвестировании их. Программа должна отслеживать эти инвестиции. Я использую массив, чтобы назначить инвестиции каждого друга. Я импортирую файл с именем investments.txt, и это необходимо для компиляции этого кода.

Моя проблема - сам бинарный поиск. Я знаю, что мой массив действителен, и он отсортирован по пузырьковой сортировке. И все это работает, так что никаких проблем нет, но по какой-то неизвестной мне причине, или, по крайней мере, я не вижу этого, каждый раз, когда я ищу значение в моем массиве (действительное значение из импорта txt-файла), оно считает это "Не найдено!". Он не будет печатать действительную информацию для пользователя, я не уверен, почему.

Пример того, как должен выглядеть вывод:

Хотите найти сумму для инвестирования? (Да / Нет) Да

Введите сумму инвестиций: 10075,45

Сумма инвестиций 10075,45 находится на позиции 34.

System.out.println("Would you like to search for an investment amount? (Y/N)");

    String answer= in.nextLine();//Prompt the user for binary search

        while (answer.equalsIgnoreCase("Y")) {
        System.out.println("Enter the investment amount");
        double userSrc = in.nextDouble();

        int n = 0;
        int first = 0;
        int last = n - 1;
        int middle = (first+last)/2;

           while (first <= last) {
              if (fileArray[middle] < userSrc)
                 first = middle + 1;    
              else if (fileArray[middle] == userSrc) {
                 System.out.printf("%f found at location %d.\n", userSrc, middle+1);
                 return;
              }
              else
                 last = middle - 1;

              middle = (first + last)/2;
           }
           if (first > last)
              System.out.printf("Not found! %f isn't present in the list.\n", userSrc);

           return;  
        }
    }

1 Ответ

1 голос
/ 24 апреля 2019

Спасибо за упрощенный код.В приведенном вами примере не хватает нескольких вещей, которые я быстро добавил для компиляции.

В прошлых изменениях вы включали

double[] fileArray = {"5", "100", "146.15", "314.56", "600.92"};

Что неплохо, требуются тестовые данные,Это не должно было быть удалено из вопроса, для этого нужно было расставить цитаты вокруг значений, чтобы их можно было рассматривать как правильные двойники.Имея это в виду, кажется, что вы случайно инициализировали int n = 0 вместо int n = fileArray.length.Похоже, что это проблема обеих редакций программы.Помните, что n должно быть количеством элементов, которые вы сохранили в массиве, когда дело доходит до этого метода сортировки, поэтому его значение в 0 приведет к неправильной инициализации всех других значений и будет обрабатывать их так, как если бы в элементах было 0массив.Вот мой исправленный код:

import java.util.*;
public class binarysearch{

     public static void main(String []args){
        double[] fileArray = {5, 100, 146.15, 314.56, 600.92};
        Scanner in = new Scanner(System.in);
        System.out.println("Would you like to search for an investment amount? (Y/N)");

        String answer= in.nextLine();//Prompt the user for binary search

        while (answer.equalsIgnoreCase("Y")) {
            System.out.println("Enter the investment amount");
            double userSrc = in.nextDouble();

            int n = fileArray.length;
            int first = 0;
            int last = n - 1;
            int middle = (first+last)/2;
            while (first <= last) {
                if (fileArray[middle] < userSrc)
                    first = middle + 1;    
                else if (fileArray[middle] == userSrc) {
                    System.out.printf("%f found at location %d.\n", userSrc, middle+1);
                    //return;
                    break;
                }
                else
                    last = middle - 1;

                    middle = (first + last)/2;
            }
            if (first > last)
                System.out.printf("Not found! %f isn't present in the list.\n", userSrc);

            //return;
            System.out.println("Would you like to search for an investment amount? (Y/N)");
            answer= in.nextLine(); 
        }
    }
}

Вывод для Y 146.15:

Would you like to search for an investment amount? (Y/N)
Enter the investment amount
146.150000 found at location 3.

Наконец, обратите внимание, что ваша программа возвращается после нахождения одного значения.Этот возврат все еще в основном, поэтому он выходит из программы.Это приведет к тому, что пользователи не будут никуда добираться.Я бы заменил это на break;, чтобы выйти ТОЛЬКО из цикла и полностью удалить тот, что находится в конце цикла.Также могут быть висят новые строки из вызовов nextDouble, которые вы, возможно, захотите посмотреть.Я оставлю это для вас, чтобы поиграть.Может быть, даже попробуйте с входами, как 146.150000000001.

...