我想创建一个可扩展的数组。当你尝试向数组中添加一个元素时,它已经满了:
(包括要添加的新元素),
有人能给予我一些关于如何做到这一点的指点吗?
编辑:
注意:我不能使用ArrayList。
cqoc49vn1#
如果你不能使用ArrayList,那么你必须编写自己的类,它基本上做与ArrayList相同的事情。你的类需要保存一个数组的引用,以及一个整数,表示有多少值被放入其中(因为它可能小于数组的当前大小)。当一个元素被添加到数组中时,根据数组的当前大小检查该整数。如果它小于数组的大小,则意味着有空间容纳另一个元素,因此只需使用整数作为索引将新值放入数组中,然后将整数加1。如果整数等于或大于数组的大小,则意味着需要更大的数组。你需要编写代码来创建一个新数组,并将所有值复制到其中。当你创建一个更大的数组时,你可能会想让它足够大以容纳多个额外的值,这样你就不必在每次添加新元素时都创建新的数组(并复制大量的值)。一个常见的技术是使新数组的大小是旧数组的某个百分比,比如150%。
7gs2gvoe2#
这段代码没有经过测试,但它应该给予你一个起点,你应该做什么。我只实现了整数,但我相信你可以扩展这甚至更多。
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; } }
顺便说一句,这段代码中有很多地方你可以改进(效率等),我鼓励你去尝试。这是一个很好的练习:)
o2gm4chl3#
使用ArrayList检查javadoc,我认为这是你在寻找什么
koaltpgm4#
我建议你检查ArrayList类的source code。
zrfyljdw5#
正如其他人建议的那样,如果可能的话,使用ArrayList。但是如果由于某种原因(我猜是家庭作业?)你不能使用ArrayList,那么看看System.arraycopy来有效地复制数组。
jxct1oxe6#
你应该使用一个ArrayList。见tutorial。如果你不能使用数组列表,从你的编辑,那么你需要循环数组,并根据当前数组的长度将每个元素移动到一个更大的数组中。一个简单的谷歌搜索应该回答这个问题。
6条答案
按热度按时间cqoc49vn1#
如果你不能使用ArrayList,那么你必须编写自己的类,它基本上做与ArrayList相同的事情。
你的类需要保存一个数组的引用,以及一个整数,表示有多少值被放入其中(因为它可能小于数组的当前大小)。
当一个元素被添加到数组中时,根据数组的当前大小检查该整数。如果它小于数组的大小,则意味着有空间容纳另一个元素,因此只需使用整数作为索引将新值放入数组中,然后将整数加1。如果整数等于或大于数组的大小,则意味着需要更大的数组。你需要编写代码来创建一个新数组,并将所有值复制到其中。
当你创建一个更大的数组时,你可能会想让它足够大以容纳多个额外的值,这样你就不必在每次添加新元素时都创建新的数组(并复制大量的值)。一个常见的技术是使新数组的大小是旧数组的某个百分比,比如150%。
7gs2gvoe2#
这段代码没有经过测试,但它应该给予你一个起点,你应该做什么。我只实现了整数,但我相信你可以扩展这甚至更多。
顺便说一句,这段代码中有很多地方你可以改进(效率等),我鼓励你去尝试。这是一个很好的练习:)
o2gm4chl3#
使用ArrayList检查javadoc,我认为这是你在寻找什么
koaltpgm4#
我建议你检查ArrayList类的source code。
zrfyljdw5#
正如其他人建议的那样,如果可能的话,使用ArrayList。但是如果由于某种原因(我猜是家庭作业?)你不能使用ArrayList,那么看看System.arraycopy来有效地复制数组。
jxct1oxe6#
你应该使用一个ArrayList。见tutorial。
如果你不能使用数组列表,从你的编辑,那么你需要循环数组,并根据当前数组的长度将每个元素移动到一个更大的数组中。
一个简单的谷歌搜索应该回答这个问题。