Чтение текстового файла в массив и выполнение сортировки в Java - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть домашний вопрос, мне нужна помощь с

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

В задаче также сказано, что мне нужно использовать метод перегрузки, но я не уверен, где

У меня есть пузырьковая сортировка, которую я тестировал на небольшом массиве символов, которая работает

public static void bubbleV1String(String[]numbers)
{
    for(int i = 0; i < numbers.length-1; i++)
    {
        for(int j = 0; j < numbers.length-1; j++)
        {
            if(numbers[j] .compareTo(numbers[j+1])>0)
            {
                String temp = numbers[j+1];
                numbers[j+1] = numbers[j];
                numbers[j] = temp;
            }
        }
    }
}`

И мой бинарный поиск, который я тестировал на том же небольшом массиве

    public static String binarySearch(int[] numbers, int wanted)
{
    ArrayUtilities.bucketSort(numbers);

    int left = 0;
    int right = numbers.length-1;

    while(left <= right)
    {
        int middle = (left+right)/2;

        if (numbers[middle] == wanted)
        {
            return (wanted + " was found at position " + middle);
        }

        else if(numbers[middle] > wanted)
        {
            right = middle - 1;
        }

        else
        {
            left = middle + 1;
        }

    }
    return wanted + " was not found";
}

Вот мой код в классе приложения для чтения и сортировки файла

        String[] myArray = new String[100000];
    int index = 0;

    File text = new File("threebears.txt");

    try {
        Scanner scan = new Scanner(text);

        while(scan.hasNextLine() && index < 100000)
        {
            myArray[index] = scan.nextLine();
            index++;
        }
        scan.close();
    } catch (IOException e) {
        System.out.println("Problem with file");
        e.printStackTrace();
    }

    ArrayUtilities.bubbleV1String(myArray);
    try {
        FileWriter outFile = new FileWriter("sorted1.txt");
        PrintWriter out = new PrintWriter(outFile);

        for(String item : myArray)
        {
            out.println(item);

        }
        out.close();

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

Когда я запускаю код, я получаю исключение нулевого указателя и следующее сообщение

 Exception in thread "main" java.lang.NullPointerException
at java.base/java.lang.String.compareTo(Unknown Source)
at parrayutilities.ArrayUtilities.bubbleV1String(ArrayUtilities.java:129)
at parrayutilities.binarySearchApp.main(binarySearchApp.java:32)

Строка 129 относится к этой строке кода моей сортировки пузырьков

                if(numbers[j] .compareTo(numbers[j+1])>0)

И строка 32 относится к фрагменту кода, где я называю сортировку пузырьков

ArrayUtilities.bubbleV1String(myArray);

Кто-нибудь знает, почему я получаю исключение нулевого указателя, когда я тестировал сортировку пузырьков на небольшом строковом массиве?Я думаю, возможно, что-то делать с перегруженным методом, упомянутым ранее, но я не уверен,

Спасибо

Ответы [ 3 ]

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

Перегрузка метода - это когда несколько функций имеют одно и то же имя, но разные параметры.

например. (взято из википедии - перегрузка функции)

// volume of a cube
int volume(const int s)
{
    return s*s*s;
}

// volume of a cylinder
double volume(const double r, const int h)
{
    return 3.1415926*r*r*static_cast<double>(h);
}

Что касается исключения из нулевого указателя, вы создали массив размером 100000, но, скорее всего, вы не прочитали достаточно информации, чтобы заполнить этот размер. Поэтому часть массива пуста, когда вы пытаетесь получить к нему доступ. Есть несколько способов, которыми вы можете воспользоваться, начиная с моей головы: списки массивов, динамические массивы или даже перемещение содержимого массива в другое, если вы знаете размер содержимого (однако это неэффективно).

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

Вы создаете массив длиной 100000 и заполняете строки по мере их чтения. Первоначально все элементы будут иметь значение null, и после прочтения файла, вероятно, их число все еще будет null. Таким образом, когда вы сортируете массив, numbers[j] в конечном итоге будет элементом null, и, следовательно, вызов compareTo(...) для этого вызовет исключение NullPointerException.

Чтобы это исправить, вам нужно знать, где в массиве заканчивается ненулевая часть. Вы уже отслеживаете количество прочитанных строк в index, поэтому после чтения файла это будет индекс первого нулевого элемента.

Теперь у вас есть 2 варианта:

  • Передайте index на bubbleV1String() и сделайте for(int i = 0; i < index-1; i++) и т. Д.
  • Сделать копию массива после чтения строк и перед сортировкой:
    String[] copy = new String[index];
    StringSystem.arrayCopy(myArray,0,copy,0,index);
    //optional but it can make the rest of the code easier to handle: replace myArray with copy
    myArray = copy;

Наконец, вы также можете использовать List<String>, что было бы лучше, чем использование массивов, но я предполагаю, что это будет рассмотрено в будущем уроке.

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

Кажется, что у вас есть нулевые значения в вашем массиве numbers. Попробуйте отладить свой код (или просто напечатать содержимое массива) и проверьте, что у вас там есть. Трудно сказать что-либо, не зная, что находится в вашем входном файле.

...