将文本文件读入数组并用Java执行排序

时间:2019-04-02 09:09:03

标签: java binary-search bubble-sort

我有一个家庭作业问题,需要帮助

我们得到了一个故事文件,每行包含一个单词的文本文件。 我们需要将该文件读入数组,对数组进行排序,然后执行二进制搜索。

任务还说我需要使用重载方法,但是我不确定在哪里

我有一个冒泡排序,我已经对一小部分有效的字符进行了测试

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行指的是我的Bubblesort的这一行代码

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

第32行指的是我称之为气泡排序的代码段

ArrayUtilities.bubbleV1String(myArray);

有人在小字符串数组上测试bubbleort时为什么知道为什么出现空指针异常?我在想可能与前面提到的重载方法有关,但我不确定

谢谢

3 个答案:

答案 0 :(得分:1)

似乎您的numbers数组中有一些空值。尝试调试您的代码(或仅打印阵列的内容),并验证其中的内容。很难说什么都不知道输入文件中的内容。

答案 1 :(得分:1)

方法重载是当多个函数具有相同的名称但参数不同时。

例如(摘自Wikipedia-函数重载)

// 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的数组,但是可能您没有读够足够的信息来填充该大小。因此,当您尝试访问某些数组时,该数组为空。一旦知道了内容的大小,就可以有多种方法来解决这个问题,包括数组列表,动态数组,甚至将数组的内容移动到另一个数组(但是效率很低)。

答案 2 :(得分:1)

您正在创建一个长度为100000的数组,并在读取行时对其进行填充。最初,所有元素都是null,并且在读取文件后,相当多的元素可能仍然是null。因此,当您对数组numbers[j]进行排序时,最终将是一个null元素,因此调用compareTo(...)将会抛出NullPointerException。

要解决此问题,您需要知道数组中非空部分的结尾。您已经在跟踪index中的读取行数,因此在读取文件后,该文件将成为第一个null元素的索引。

现在您基本上有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>,它比使用数组要好,但是我认为这将在以后的课程中介绍。