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

问题描述 投票:0回答:3

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

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

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

我有一个冒泡排序,我已经测试了一小部分有用的角色

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

这是我在app类中的代码,用于读取文件并对其进行排序

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

当我在一个小字符串数组上测试bubblesort时,有谁知道为什么我得到一个空指针异常?我想可能与之前提到的重载方法有关,但我不确定

谢谢

java binary-search bubble-sort
3个回答
1
投票

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

要解决此问题,您需要知道数组中非空零件的结束位置。您已经在index中跟踪读取行的数量,因此在读取将作为第一个null元素的索引的文件之后。

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

  • 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
投票

看来你的numbers数组中有一些空值。尝试调试您的代码(或只是打印数组的内容)并验证您的代码。很难说出任何不知道输入文件中的内容的东西。


1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.