我有一个需要帮助的作业问题
我们得到了一个文本文件,每行包含一个单词,一个故事。我们需要将此文件读入数组,对数组执行排序,然后执行二进制搜索。
该任务还说我需要使用重载方法,但我不确定在哪里
我有一个冒泡排序,我已经测试了一小部分有用的角色
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时,有谁知道为什么我得到一个空指针异常?我想可能与之前提到的重载方法有关,但我不确定
谢谢
您正在创建一个长度为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>
,它比使用数组更好,但我认为这将在未来的课程中涵盖。
看来你的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的数组,但是您可能没有读取足够的信息来填充该大小。因此,当您尝试访问它时,某些数组是空的。有一些方法可以解决这个问题,包括数组列表,动态数组,甚至将数组内容移动到另一个,一旦你知道内容的大小(但这是低效的)。