我有一个家庭作业问题,需要帮助
我们得到了一个故事文件,每行包含一个单词的文本文件。 我们需要将该文件读入数组,对数组进行排序,然后执行二进制搜索。
任务还说我需要使用重载方法,但是我不确定在哪里
我有一个冒泡排序,我已经对一小部分有效的字符进行了测试
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时为什么知道为什么出现空指针异常?我在想可能与前面提到的重载方法有关,但我不确定
谢谢
答案 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>
,它比使用数组要好,但是我认为这将在以后的课程中介绍。