这里,我有一个quickSort,它对String数组进行排序以及它的开始和结束位置 sortA(String [] s,int start,int end)
String[] wordlist = new String[5000000];
QuickSort quickSort = new QuickSort();
int number = 0, startN = 0;
public void read() throws IOException
{
Scanner keyboard = new Scanner(System.in);
System.out.println("Please enter the name of the file you want to read from");
String readFile = keyboard.nextLine();
try
{
Scanner sc2 = null;
sc2 = new Scanner(new File(readFile));
startN = number;
while (sc2.hasNextLine())
{
Scanner s2 = new Scanner(sc2.nextLine());
boolean b;
while (b = s2.hasNext())
{
String s = s2.next();
s = s.replaceAll("[^A-Za-z]","");
wordlist[number] = s;
number++;
System.out.println(s + "|" +number);
}
}
quickSort.sortA(wordlist, startN, number);
}
catch(FileNotFoundException e)
{
System.out.println("File not Found, please try again");
}
}
我正在读取普通文件并尝试排序,但它给了我:
java.lang.NullPointerException
at java.lang.String.compareTo(String.java:578)
at QuickSort.partition(QuickSort.java:21)
at QuickSort.sortA(QuickSort.java:7)
at WordMatch.read(WordMatch.java:33)
at WordMatch.main(WordMatch.java:73)
转到QuickSort.java:
public class QuickSort
{
static void sortA(String[] s, int start, int end)
{
if (end > start)
{
int pivot = partition(s, start, end);
sortA(s, start, pivot-1);
sortA(s, pivot, end);
}
}
private static int partition(String[] s, int start, int end)
{
String pivot = s[end];
int left = start;
int right = end;
String temp = "";
do
{
while ((s[left].compareTo(pivot) <= 0) && (left < end))
left++;
while ((s[right].compareTo(pivot) > 0) && (right > start))
right--;
if (left < right)
{
temp = s[left];
s[left] = s[end];
s[right] = temp;
}
} while (left < right);
temp = s[left];
s[left] = s[end];
s[end] = temp;
return left;
}
}
但它似乎没有错......
答案 0 :(得分:1)
String.compareTo()
, null
会抛出一个NPE,这就是你必须要做的事情。
查看代码,您正在传递s[end]
(通过变量pivot
),因此您的数组必须包含null。追溯调用堆栈,我们看到传递的数组是wordList
,其初始化大小为5000000
;除非你的输入中有完全 5000000个单词,否则你的代码会抛出异常... 4999999或更少,你会得到一个NPE,5000001或更多,你会得到一个ArrayIndexOutOfBoundsException。
我最喜欢的一句咒语捕获了补救措施:不要使用数组!
使用大小越来越大的List<String>
来捕获输入。如果您的算法需要一个数组,请通过List的toArray()
方法将列表转换为数组,该方法返回一个大小合适的数组。此更改将解决您的问题。
答案 1 :(得分:0)
调用快速排序quickSort.sortA(wordlist, startN, number);
似乎有问题。由于在该行之前,您在循环中增加了number
,这意味着最后number
具有增加的值。您可以尝试这样quickSort.sortA(wordlist, startN, number-1);
由于