【问题标题】:Generic Array List [duplicate]通用数组列表 [重复]
【发布时间】:2017-02-06 01:02:17
【问题描述】:

我需要使用泛型创建一个数组列表。我的 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];
        }
    }
}

【问题讨论】:

    标签: java arrays generics get bluej


    【解决方案1】:

    您的 add 方法不起作用,因为您使用的初始支持数组的长度为 0,即使您尝试将其加倍(因为 0*2==0),它仍然为 0。

    当您调整后备数组的大小时,您还忘记了实际添加新元素。如果你没有忘记这一点,你会在add 中得到异常。

    首先,将构造函数创建的数组的初始大小更改为正数:

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

    然后添加

    data[count] = v;
    

    add 方法的 else 子句(就在 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++;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 2011-01-07
      • 2021-08-02
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多