Search code examples
javabinary-searchbubble-sort

Reading a text file into an array and performing a sort in Java


I have a homework question I need help with

We have been given a text file containing one word per line, of a story. We need to read this file into an array, perform a sort on the array and then perform a binary search.

The task also says I'll need to use an overload method, but I'm unsure where

I have a bubble sort, that I've tested on a small array of characters which works

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;
            }
        }
    }
}`

And my binary search which I've tested on the same small array

    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";
}

Here is my code in an app class to read in a file and sort it

        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();
    }

When I go to run the code, I get a null pointer exception and the following message

 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)

Line 129 refers to this line of code of my bubblesort

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

And line 32 refers to the piece of code where I call the bubblesort

ArrayUtilities.bubbleV1String(myArray);

Does anyone know why I'm getting a null pointer exception when I've tested the bubblesort on a small string array? I'm thinking possibly something to do with the overloaded method mentioned earlier but I'm not sure

Thanks


Solution

  • You are creating an array of length 100000 and fill the lines as they are read. Initially all elements will be null and after reading the file quite a number of them is likely to still be null. Thus when you sort the array numbers[j] will eventually be a null element and thus calling compareTo(...) on that will throw a NullPointerException.

    To fix that you need to know where in the array the non-null part ends. You are already tracking the number of read lines in index so after reading the file that would be the index of the first null element.

    Now you basically have 2 options:

    • Pass index to bubbleV1String() and do for(int i = 0; i < index-1; i++) etc.
    • Make a copy of the array after reading the lines and before sorting it:
        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;
    

    Finally you could also use a List<String> which would be better than using arrays but I assume that's covered by a future lesson.