我正在编码通过codingbat.com/java并遇到了一个我不明白的错误。我有两个String数组,想要比较它们。如果我只是使用数组一切正常(但结果不对)。为了得到正确的结果,我编写了一个辅助函数,它消除了数组的所有重复。我测试了辅助函数,它返回了重复数组缩短的数组。
我可以使用_a[i]
等检索新数组中的值,但不会出现错误,但如果我使用_a[0].equals(_b[0]) or _a[0].compareTo(_b[0])
,我会得到NullPointerException (_a[0] == _b[0] works fine...)
。
如果我只使用原始数组a,b代码运行没有问题。我不明白为什么我会在那里得到NullpointerException。
感谢您的帮助!
代码:
public int commonTwo(String[] a, String[] b) {
String[] _a = killDuplicate(a);
String[] _b = killDuplicate(b);
int ai=0, bi=0,count=0;
for (int i = 0; ai < _a.length & bi < _b.length; i++){
if ( _a[ai].compareTo(_b[bi]) > 0) { //NullPointerException here, but not if I use a,b
bi++;
} else if ( _a[ai].compareTo(_b[bi]) < 0){ //NullPointerException here, but not if I use a,b
ai++;
} else {
count++;
ai++;
bi++;
}
}
return count;
}
辅助功能:
public String[] killDuplicate(String[] a){
String temp = "";
int counter = 0, counter2 = 0;
for (int i = 0; i < a.length; i++){
if (! a[i].equals(temp)){
temp = a[i];
} else {
a[i] = "";
counter++;
}
}
String[] result = new String[a.length - counter];
for (int i = 0; counter2 < counter; i++){
if (a[i].equals("")) {
counter2++;
}
} else {
result[i-counter2] = a[i];
}
return result;
}
答案 0 :(得分:0)
我猜你假设你的字符串数组已经排序,否则你的killDuplicate
方法根本没有意义。
您的代码存在的问题是,在for
方法的第二个killDuplicate
循环中,您使用条件counter2 < counter
进行迭代,该条件表示迭代,直到找到所有找到的重复项。因此,当您找到最后一个副本时,退出而不填充数组的其余部分。尝试使用示例:new String[]{"A", "A", "B", "C"}
您将获得[A, null, null]
。
有许多内容可以改进,但下面对代码进行最简单的修改。 (我只改变了第二个for
循环)
public String [] killDuplicate(String [] a){
String temp = "";
int counter = 0, counter2 = 0;
for (int i = 0; i < a.length; i++) {
if (!a[i].equals(temp))
temp = a[i];
else {
a[i] = "";
counter++;
}
}
String[] result = new String[a.length - counter];
for (int i = 0; i < a.length; i++) {
if (a[i].equals("")) continue;
result[counter2] = a[i];
counter2++;
}
return result;
}