我目前正在尝试在Java中实现基于“算法简介:第三版”中的合并排序算法。
作者使用分而治之的算法,该算法也实现了哨兵卡(here is pseudo code)。这些卡应该具有无穷大的值,但由于我使用的是字符串数组,因此我假设该值为null
。显然情况并非如此,因为当我尝试比较L [i]和R [j]时,我得到一个空指针异常。这是我的代码:
public static void main(String[] args) {
Scanner textfile = new Scanner(System.in);
System.out.println("Enter a filename: ");
String fileName = textfile.nextLine();
String[] words = readArray(fileName);
mergeSort(words, 0, words.length - 1);
for (String word : words) {
System.out.println(word);
}
}
public static String[] readArray(String file) {
int ctr = 0;
try {
Scanner s1 = new Scanner(new File(file));
while (s1.hasNextLine()) {
ctr = ctr + 1;
s1.nextLine();
}
String[] words = new String[ctr];
Scanner s2 = new Scanner(new File(file));
for(int i = 0; i < ctr; i++) {
words[i] = s2.next();
}
return words;
}
catch (FileNotFoundException e){
System.out.println("File not found.");
}
return null;
}
public static void mergeSort(String[] A, int p, int r) {
if (p < r) {
int q = (p + r) / 2;
mergeSort(A, p, q);
mergeSort(A, q + 1, r);
merge(A, p, q, r);
}
}
public static void merge(String[] A, int p, int q, int r) {
int n1 = q - p + 1;
int n2 = r - q;
String[] left = new String[n1 + 1];
String[] right = new String[n2 + 1];
for (int i = 0; i < n1; i++) {
left[i] = A[p + i];
}
for (int j = 0; j < n2; j++) {
left[j] = A[q + j + 1];
}
left[n1] = null;
right[n2] = null;
for (int i = 0, j = 0, k = p; k < r; k++) {
if (left[i].compareTo(right[j]) <= 0) { \\Null Pointer Exception
A[k] = left[i];
i++;
} else {
A[k] = right[j];
j++;
}
}
}
那么问题是什么?是因为我将两个数组声明为null
吗?我试过像“zzzz”这样的东西,但仍然遇到同样的问题。还是我完全错过了其他的东西?
此外,伪代码假定数组从索引1开始,这就是我的代码略有变化的原因。我在那里做错了吗?
答案 0 :(得分:0)
你是无限的 - String
必须满足以下属性:
s.compareTo(infinityString) == -1
任何 s
,如果您想使用String#compareTo
。据说infinityString = null
不会产生必需的属性,因为如果代码NullPointerException
a.compareTo(b)
或a
是b
,则会生成infinityString
String
。只需使用足够长String
个任意字符就会有真正丑陋的解决方法,因此输入中不存在同样长的String#compareTo
。但是那个:
相反,我建议使用以下两种方法之一:
compare(s , infinityString) = -1
,这会为您要定义infinityString
的任何内容生成属性class BrowserChecker
def initialize(browser)
@browser = browser
@version = browser.version.to_i
end
def browser_not_supported?
!@browser.modern? || chrome_bad? || firefox_bad? || io_bad?
end
private
def chrome_bad?
@browser.chrome? && @version < AppConfig.requirements['browser_google'].to_i
end
def firefox_bad?
@browser.firefox? && @version < AppConfig.requirements['browser_firefox'].to_i
end
def safari_bad?
@browser.safari? && @version < AppConfig.requirements['browser_safari'].to_i
end
def ie_bad?
@browser.ie? && @version < AppConfig.requirements['browser_msft'].to_i
end
end
# called like this
BrowserChecker.new(some_browser_object)
。