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

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

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

我们得到了一个文本文件,每行一个单词,一个故事。 我们需要将这个文件读入一个数组,对数组进行排序,然后进行二分查找。

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

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

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

这是我在应用程序中的代码 class 用于读取文件并对其进行排序

        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行指的是我调用bubblesort的那段代码

ArrayUtilities.bubbleV1String(myArray);

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

谢谢

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

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

例如(取自维基百科——函数重载)

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

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

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

现在你基本上有两个选择:

  • 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>,这比使用数组要好,但我认为这会在以后的课程中介绍。