-2

我想创建一个可扩展的数组。每当您尝试将另一个元素添加到当前数组中并且它已满时,它应该将当前数组中的每个元素复制到新数组中(包括您要添加的新元素),然后删除旧数组。谁能给我一些关于如何做到这一点的指示?

编辑: 注意:我不能为此使用数组列表

4

6 回答 6

3

如果您不能使用 ArrayList,那么您将不得不编写自己的类,该类基本上与 ArrayList 做同样的事情。

您的类将需要保存对数组的引用,以及一个表示已放入多少值的整数(因为它可能小于数组的当前大小)。

当一个元素被添加到数组中时,检查该整数与数组的当前大小。如果它小于数组的大小,则意味着还有空间容纳另一个元素,所以只需将新值放入数组中,使用整数作为索引,然后在整数上加一。如果整数等于或大于数组的大小,则意味着您需要一个更大的数组,您必须编写代码来创建一个新数组并将所有值复制到其中。

当您创建一个更大的数组时,您可能希望使其足够大以容纳多个附加值,这样您就不必在每次添加新元素时都创建新数组(并复制大量值) . 一种常见的技术是使新数组大小为旧数组的某个百分比,例如 150%。

于 2012-10-14T16:12:16.507 回答
1

此代码未经测试,但它应该为您提供一个起点,让您了解应该做什么。我只在 Integer 上实现,但我相信你可以进一步扩展它。

public class ExtendableArray {

    private Integer[] arr;

    public ExtendableArray(int capacity) {
        arr = new Integer[capacity];
    }

    public void add(Integer item) {
        if (getLastIndex() == arr.length) {
            generateBiggerArray();
            return;
        }
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == null) {
                arr[i] = item;
                break;
            }
        }
    }

    private void generateBiggerArray() {
        int currentCapacity = arr.length;
        Integer[] tempArr = new Integer[currentCapacity + 4];
        for(int i = 0; i < arr.length; i++) {
            tempArr[i] = arr[i];
        }
        this.arr = tempArr;
    }

    private int getLastIndex() {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == null)
                return i;
        }
        return arr.length;
    }
}

顺便说一句-此代码中有很多地方可以改进(效率等)。我鼓励您尝试。这是一个很好的练习:)

于 2012-10-14T16:18:19.747 回答
0

您应该使用 ArrayList。请参阅本教程

如果您不能从您的编辑中使用数组列表,那么您需要循环数组并根据当前数组的长度将每个元素移动到更大的数组中。

一个简单的谷歌搜索应该可以回答这个问题。

于 2012-10-14T16:04:35.103 回答
0

使用 ArrayList检查 javadoc,我认为这是你要找的

于 2012-10-14T16:05:35.807 回答
0

我建议您查看 ArrayList 类的源代码

于 2012-10-14T16:06:13.393 回答
0

正如其他人建议的那样,尽可能使用 ArrayList。但是如果由于某种原因你不能(我猜是作业?),那么看看System.arraycopy来有效地复制数组。

于 2012-10-14T16:10:05.750 回答