Java 用二进制搜索查找数组中的元素
正在尝试使用Java 用二进制搜索查找数组中的元素,java,arrays,binary-search,Java,Arrays,Binary Search,正在尝试使用Arrays.binarySearch()在数组中搜索字符串并返回索引。但是,每次调用Arrays.binarySearch()时,我都会遇到以下异常- Exception in thread "main" java.lang.NullPointerException at java.util.Arrays.binarySearch0(Unknown Source) at java.util.Arrays.binarySearch(Unknown Source) at project
Arrays.binarySearch()
在数组中搜索字符串并返回索引。但是,每次调用Arrays.binarySearch()
时,我都会遇到以下异常-
Exception in thread "main" java.lang.NullPointerException
at java.util.Arrays.binarySearch0(Unknown Source)
at java.util.Arrays.binarySearch(Unknown Source)
at project.ArrayDirectory.lookupNumber(ArrayDirectory.java:97)
at project.test.main(test.java:12)
这是我的ArrayDirectory类
-
public class ArrayDirectory implements Directory {
static Entry[] directory = new Entry[50];
@Override
public void addEntry(String surname, String initials, int extension) {
int n = 0;
for (int i = 0; i < directory.length; i++) { // counting number of
// entries in array
if (directory[i] != null) {
n++;
}
}
if (n == directory.length) {
Entry[] temp = new Entry[directory.length * 2]; // if array is full
// double the
// length.
for (int i = 0; i < directory.length; i++)
temp[i] = directory[i];
directory = temp;
}
int position = -1;
for (int i = 0; i < directory.length; i++) {
position = i;
if (directory[i] != null) { // sorting the array into alphabetical
// order by surname.
int y = directory[i].getSurname().compareTo(surname);
if (y > 0) {
break;
}
}
else if (directory[i] == null) {
break;
}
}
System.arraycopy(directory, position, directory, position + 1,
directory.length - position - 1);
directory[position] = new Entry(initials, surname, extension); // placing
// new
// entry
// in
// correct
// position.
}
@Override
public int lookupNumber(String surname, String initials) {
// TODO Auto-generated method stub
Entry lookup = new Entry(surname, initials);
int index = Arrays.binarySearch(directory, lookup);
return index;
}
在你召唤
int index = Arrays.binarySearch(directory,lookup);
目录
似乎只包含null
元素。检查您是否正确初始化了元素。我注意到两件事:
static Entry [] directory = new Entry [1];
首先,该代码为数组中的一个条目分配空间。它实际上并没有实例化一个条目。也就是说,
目录[0]
为null
。其次,在一个数组中用一个条目进行二进制搜索是疯狂的。只有一个元素。它必须是目录[0]。最后,您应该对数组进行排序,以便对其进行二进制搜索。二进制搜索背后的基本概念是以下步骤的递归(注意,搜索假定元素列表或数组以某种形式排序,并且元素存在于其中):
如果不是,则检查所搜索的元素是否比中间元素小或更大。
public static int binarySearch(int number, int[] array)
{
boolean isHere = false;
Integer index =0;
for(int i=0;i<array.length;i++)
{
if(array[i] == number)
{
isHere = true;
i = array.length;
}
}
if(!isHere)
{
index = -1;
}
else
{
int arrayStart = 0;
int arrayEnd = array.length;
index = binarySearch(number, arrayStart, arrayEnd, array);
}
return index;
}
private static int binarySearch(int number, int start, int end, int[] array)
{
// this formula ensures the index number will be preserved even if
// the array is divided later.
int middle = (start+ end)/ 2;
if(array[middle] == number)
{
return middle;
}
else
{
if(number < array[middle])
{
//searches the first half of the array
return binarySearch(number, start, middle, array);
}
else
{
// searches the last half of the array
return binarySearch(number, middle, end, array);
}
}
}
公共静态int-binarySearch(int-number,int[]数组)
{
布尔isHere=假;
整数指数=0;
对于(int i=0;我只是注意到,很抱歉,这是一个错误,数组应该设置为更大的长度,如50左右,之前正在测试数组的两倍大小。在查看我的测试类后,我意识到我没有正确地初始化我的条目
对象。当我纠正这个错误时,它最初似乎解决了我的问题,但后来当我多次调用lookupNumber(姓氏、首字母缩写)
时,我再次遇到同样的异常。关于我做错了什么,有什么想法吗?谢谢you@Nick目录或其元素为空。这些行中的任何其他内容都不会导致NPE。请尝试在使用它们之前记录它们的值。
public static int binarySearch(int number, int[] array)
{
boolean isHere = false;
Integer index =0;
for(int i=0;i<array.length;i++)
{
if(array[i] == number)
{
isHere = true;
i = array.length;
}
}
if(!isHere)
{
index = -1;
}
else
{
int arrayStart = 0;
int arrayEnd = array.length;
index = binarySearch(number, arrayStart, arrayEnd, array);
}
return index;
}
private static int binarySearch(int number, int start, int end, int[] array)
{
// this formula ensures the index number will be preserved even if
// the array is divided later.
int middle = (start+ end)/ 2;
if(array[middle] == number)
{
return middle;
}
else
{
if(number < array[middle])
{
//searches the first half of the array
return binarySearch(number, start, middle, array);
}
else
{
// searches the last half of the array
return binarySearch(number, middle, end, array);
}
}
}