移动数组中的元素

时间:2014-04-13 13:01:51

标签: java arrays

我有一个对象数组,我想在这个数组中添加元素并同时按升序对它们进行排序。虽然我尝试了很多编译,但我总是采用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;
    }

3 个答案:

答案 0 :(得分:1)

删除for(int i=0;i<=size();i++)中的等号。也就是说,改为

for(int i=0;i<size();i++)

数组索引从0size-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)您可能希望使用二进制搜索来查找插入点。它比线性搜索具有更好的性能。