通用数组列表
Generic Array List
我需要使用泛型创建数组列表。我的 add 方法有时似乎可以工作,但是我的 get 方法似乎有很多问题,而且我没有收到编译错误。但是,当我尝试使用我的 get 方法从数组列表中获取对象时,它会抛出 java 越界异常。到目前为止,这是我所拥有的,我正在使用 BlueJ。此外,说明将初始 "illusion" 长度设置为零。
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];
}
}
}
您的 add
方法不起作用,因为您使用的初始后备数组的长度为 0,即使您尝试将其加倍(因为 0*2==0),它仍然为 0。
您还忘记了在调整后备数组大小时实际添加新元素。如果您没有忘记这一点,您会在 add
.
中得到异常
首先,将构造函数创建的数组的初始大小更改为正值:
data = (X[]) new Object[10];
然后添加
data[count] = v;
到您的 add
方法的 else 子句(就在 count++;
之前)。
您的添加方法可以进一步简化:
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++;
}
我需要使用泛型创建数组列表。我的 add 方法有时似乎可以工作,但是我的 get 方法似乎有很多问题,而且我没有收到编译错误。但是,当我尝试使用我的 get 方法从数组列表中获取对象时,它会抛出 java 越界异常。到目前为止,这是我所拥有的,我正在使用 BlueJ。此外,说明将初始 "illusion" 长度设置为零。
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];
}
}
}
您的 add
方法不起作用,因为您使用的初始后备数组的长度为 0,即使您尝试将其加倍(因为 0*2==0),它仍然为 0。
您还忘记了在调整后备数组大小时实际添加新元素。如果您没有忘记这一点,您会在 add
.
首先,将构造函数创建的数组的初始大小更改为正值:
data = (X[]) new Object[10];
然后添加
data[count] = v;
到您的 add
方法的 else 子句(就在 count++;
之前)。
您的添加方法可以进一步简化:
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++;
}