2016-09-28 32 views
0

我需要使用泛型创建数组列表。我的add方法似乎有时工作,但我的get方法似乎有很多问题,我没有收到编译错误。但是,当我尝试从我的get方法从数组列表中获取一个对象时,它会引发一个java越界异常。这里我到目前为止,我正在使用BlueJ。另外,说明书将初始“错觉”长度设置为零。通用数组列表

public class AL <X> { 
    private X[]data; 
    private int count; 

    public AL() { 
     count = 0; 
     data = (X[]) new Object[0]; 
    } 

    public void add (X v) { 
     if (data.length != count) { 
      data[count] = v; 
      count++; 
     } else { 
      X [] newdata = (X[]) new Object[data.length * 2]; 
      for (int i = 0; i < data.length; i++) { 
       newdata[i] = data [i]; 
      } 
      count++; 
      data = newdata; 
     } 
    } 

    public X get(int index) { 
     if (index >= count || index < 0) { 
      throw new ICantEven(); 
     } else { 
      return data[index]; 
     } 
    } 
} 

回答

1

add方法不起作用,因为正在使用的初始背衬阵列具有0的长度,即使在尝试加倍(因为0 * 2 == 0)这仍然0。

当您重新调整后备阵列大小时,您也忘记了实际添加新元素。如果你还没有忘记,你会得到add的例外。之前

data = (X[]) new Object[10]; 

然后加入

data[count] = v; 

add法的其他条款(:

首先,改变你的构造函数创建的是积极的数组的初始大小count++;)。

你add方法可以进一步简化:

public AL() 
{ 
    count = 0; 
    data = (X[]) new Object[10]; 
} 

public void add (X v) 
{ 
    // resize backing array if necessary 
    if (data.length == count) 
    { 
     X [] newdata = (X[]) new Object[data.length * 2]; 
     for (int i = 0; i < data.length;i++) 
     { 
      newdata[i] = data [i]; 
     } 
     data = newdata; 
    } 
    // add new element 
    data[count] = v; 
    count++; 
}