所以我有一个文本文件,其中包含导入到程序中的一串字符串,程序要做的是寻找第一个重复字符串的第一个索引:
hasFeature
和我用来查找重复项的第一个索引的方法如下:
static final int NOT_FOUND = -1;
dupeIndex = indexOfFirstDupe( wordList, wordCount );
if ( dupeIndex == NOT_FOUND )
System.out.format("No duplicate values found in wordList\n");
else
System.out.format("First duplicate value in wordList found at index %d\n",dupeIndex);
问题是我收到此错误:
这是一个static int indexOfFirstDupe( String[] arr, int count )
{
Arrays.sort(arr);
int size = arr.length;
int index = NOT_FOUND;
for (int x = 0; x < size; x++) {
for (int y = x + 1; y < size; y++) {
if (arr[x].equals(arr[y])) {
index = x;
break;
}
}
}
return index;
,据我了解,这意味着我的字符串数组(?)中基本上存在一个空值。我有没有简单的解决方案?可能改写我的方法?
答案 0 :(得分:0)
假设您的诊断正确无误
...这意味着我的字符串数组中基本上存在一个空值...
...我可以想到两种解决方法。
摆脱数组中的null
引用。完全删除它们,或将其替换为""
或"null"
或其他无害的东西。
Arrays.sort
方法的重载带有第二个参数:Comparator
。因此,您可以做的是实现一个Comparator
来处理null
而不抛出NPE。 (例如,它可以将null
视为小于所有非空字符串。)
以下是处理null
的示例比较器:
public class NullSafeStringComparator implements Comparator<String> {
public int compare(String s1, String s2) {
if (s1 == s2) {
return 0;
} else if (s1 == null) {
return -1;
} else if (s2 == null) {
return 1;
} else {
return s1.compareTo(s2);
}
}
}
或者,对于Java 8和更高版本,您可以按以下方式构建一个:
Comparator.nullsFirst(Comparator.naturalOrder())
答案 1 :(得分:0)
该错误是由Array.sort(arr);
引起的根据Java文档(https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#sort-java.lang.Object%3aA-):
根据对象元素的自然顺序将指定的对象数组升序排列。 数组中的所有元素必须实现Comparable接口。
排序很可能在String数组的null对象上调用compareTo方法时,很可能引发了异常。
一个简单的直接解决方案是确保您的String数组中没有空对象...
答案 2 :(得分:0)
有一种更好的方法来做您想做的事。 这是复杂度O(n),而您的复杂度是O(n ^ 2)+排序失败。
public int indexOfFirstDup(String[] arr) {
Set<String> valuesFound = new HashSet<>();
for (int i=0;i<arr.length; i++) {
String s = arr[i];
// ignore nulls
if (s == null) { continue; }
if (valuesFound.contains(s)) {
// here we identified a duplication and we can leave
return i;
} else {
valuesFound.add(s);
}
}
// no dups
return -1;
}
请注意,代码尚未经过编译或测试-这只是一个想法!