我有一个对象数组,我想在这个数组中添加元素并同时按升序对它们进行排序。虽然我尝试了很多编译,但我总是采用java.lang.ArrayIndexOutOfBoundsException。这是我的代码的一部分:
public boolean insert(Person p)
{
for(int i=0;i<=size();i++)
{
if (c==0)
{
array[0] = p;
c++;
return true;
}
else
{
if (p.compareTo(array[i])==-1)
{
array[i]=p;
c++;
for(int j = size(); j>i; j--)
{
array[j]=array[j-1];
}
}
else if((p.compareTo(array[i])==1))
{
array[i+1]=p;
c++;
for (int j=(size()-1);j>= i+1; j--)
{
array[j+1]=array[j];
}
}
else
{
return false;
}
return true;
}
}
return false;
}
private int c;
private Person array[];
public SortedPersonList()
{
this.array = new Person[c];
}
public int size()
{
return c;
}
答案 0 :(得分:1)
删除for(int i=0;i<=size();i++)
中的等号。也就是说,改为
for(int i=0;i<size();i++)
数组索引从0
到size-1
。所以array[size()]
在数组之外。因此错误。
答案 1 :(得分:0)
您的代码:
for(int i=0;i<=size();i++)
像
一样写 for(int i=0;i<size();i++) or for(int i=0;i<=size()-1;i++)
答案 2 :(得分:0)
1)您正在将数组初始化为0,并且从不调整它的大小。数组具有固定的大小,因此为了使用超出其范围的项填充它,您应该首先创建一个更大的数组并将内容复制到它(这就是ArrayList的工作原理)。
2)找到插入点时,在将值保存在临时变量之前,不应覆盖此位置。 (另外,我不理解代码中的第三种情况。如果p大于array [i],为什么要插入?你应该重新考虑你的逻辑。)
3)您可能希望使用二进制搜索来查找插入点。它比线性搜索具有更好的性能。