在数组列表中插入/追加元素的方法

时间:2013-02-14 01:37:36

标签: java insert arraylist append

我不确定我是否正在实现插入或正确附加,但我收到此错误:

  

线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:   -1在AListInt.insert(AListInt.java:81)// listArray [i + 1] = listArray [i];在ListTest.main(ListTest.java:52)// list.insert(i);

另外我不能使用java.util.ArrayList 以下是代码和类:

课程:

public class AListInt {


int [] listArray;
int listSize;
int curr; // current position

AListInt() {
    listSize = 0;

    // note that curr = -1 when listSize = 0
    curr = -1;
    listArray = new int [2];
}

public int getValue () throws DSException {
    return listArray[curr];
      //returns the value of current position
      //throw exception when there are no elements in the list
}

public int length() {
    return listSize;
    //return # of elements in the list
}


public int currPos() {
    return curr;
    //return current position.
}

public void moveToPos ( int pos ) throws DSException {
    curr = pos;
      //move the current position to pos
      //throw exception if pos is not a valid position
}

public void moveToStart () throws DSException {
    curr = 0;
      //move the current position to the start of the list
      //throw exception if no elements are in the list
}


public void moveToEnd () throws DSException {
    curr = listSize;
      //move the current position to the end of the list
      //throw exception if no elements are in the list
}


public void prev () throws DSException {
    if(curr != 0)
    {
        curr--;
    }
      //move current position to the previous element
      //throws exception if the previous position is not legal or
      //    if there are no elements in the list
}


public void next () throws DSException {
    if(curr < listSize)
    {
        curr++;
    }
      //move current position to the next element
      //throws exception if the next position is not legal or
      //    if there are no elements in the list
}


public void insert ( int item ) {

    for(int i = listSize-1; i >= curr; i++)
    {
        listArray[i+1] = listArray[i];

    }
    listArray[curr] = item;
    listSize ++;

    int[]temp = new int[listArray.length*2];
    for(int i = 0; i< listSize; i++)
    {
        temp[i] = listArray[i];
    }
    listArray = temp;

    // inserts item to the current position
    // if not enough memory, double the size of listArray
}


public void append ( int item ) {
    listArray[listSize++] = item;

    int[]temp = new int[listArray.length*2];
    for(int i = 0; i< listSize; i++)
    {
        temp[i] = listArray[i];
        listArray = temp;
    }
    // inserts item to the end of the list
    // if not enough memory, double the size of listArray       
}

public int remove () throws DSException {
     if((curr < 0)||(curr > listSize))
     {
            return -1;
     }

 int item;
 item = listArray[curr];

    for(int i = curr; i < listSize - 1; i++)
    {
        listArray[i] = listArray[i+1];
    }
    listSize --;
    return item;
      //removes the element at the current position
      //returns the removed element

}

public void clear() {
    listSize = 0;
    curr = -1;
    //reset size.  Set current position to be -1
}

public boolean find ( int val ) {
    for(int i = 0; i > listSize; i ++)
    {
        if(listArray[i] == val)
        {
            return true;
        }
    }
    return false;
  //searches for val in the list
    //returns true if found and false if not found
}

public void print () {
    System.out.print("<");
    for(int i = 0; i < listSize; i++)
    {
        System.out.print(listArray[i]);

        if(listSize == -1)
        {
            System.out.print("-1");
        }
    }
    System.out.print(">");
    //outprint the list
}

}

异常:

    public class DSException extends Exception {
  public DSException() {
  }

  public DSException(String msg) {
    super(msg);
  }
}

主:

public class ListTest {

public static void main ( String[] args ) {

try {
    AListInt list = new AListInt();

    list.print();


    // test length()
    System.out.println ( list.length() );


    // test currPos()
    System.out.println ( list.currPos() );

    // insert some numbers
    for ( int i = 0; i < 4; i++ ) {
    list.append(i);
    list.print();
    }

    list.moveToPos(0);
    list.print();

    list.moveToEnd();
    list.print();


    // test getValue()                                                                                                                                                     
    System.out.println ( list.getValue() );

    System.out.println ( "remove: " + list.remove() );
    list.print();

    list.moveToStart();
    list.print();

    System.out.println ( "remove: " + list.remove() );
    list.print();

    list.clear();
    list.print();

    list.clear();
    list.print();

    System.out.println ( "find 0 : " + list.find ( 0 ) );

    for ( int i = 0; i < 4; i++ ) {
    list.insert(i);
    list.print();
    }

    for ( int i = 0; i < 5; i++ ) {
    System.out.println ( "find " + i + " : " + list.find ( i ) );
    list.print();
    }

    list.next();
    list.print();

    list.insert ( -9 );
    list.print();

    list.append ( -2 );
    list.print();

    list.moveToEnd();
    list.insert ( -1 );
    list.print();


    System.out.println ( "remove: " + list.remove() );
    list.print();

} catch ( DSException e ) {
    e.printStackTrace();
}

}

}

2 个答案:

答案 0 :(得分:1)

你在数组之外阅读。在

for(int i = listSize-1; i >= curr; i++)
{
    listArray[i+1] = listArray[i];

}

如果i = listSize -1,则listArray[i+1]listArray[listSize],这是超出范围的,因为数组从0转到length -1

编辑:

但是由于listArray的初始大小为2,并且每次插入时你的大小加倍,你就可以逃脱。但是,在第一次插入时curr-1,并且由于终止为i >= curr,因此将输入循环,您将读取listArray[-1](超出界限)

答案 1 :(得分:0)

它必须是listArray [i] = listArray [i-1]

因为你正在将listArray [i-1]的位置转移到listArray [i]的位置