因此,我创建了一个名为"Sack“的通用数据结构。在这个过程中,我将物品添加到一个袋子中,抓取一个随机的物品,看看它是否是空的,或者倾倒它的内容物等等。我还创建了它来扩展以容纳所需的任意数量的物品。
我目前正在研究一种ensureCapacity方法,它应该确保sack具有其参数值的容量,如果没有,则为sack创建一个新的底层数据结构,该结构是sack当前容量的两倍多。
我已经尝试了很多方法来做这件事,但是我一直收到错误。我将列出我的大部分代码,还有我尝试过的两种方法,并指出我收到的错误。
public class Sack<E>
{
public static final int DEFAULT_CAPACITY = 10;
private E [] elementData;
private int size;
@SuppressWarnings("unchecked")
public Sack()
{
elementData = (E[]) new Object[DEFAULT_CAPACITY];
}
@SuppressWarnings("unchecked")
public Sack(int capacity)
{
if(capacity < 0)
{
throw new IllegalArgumentException("capacity " + capacity);
}
this.elementData = (E[]) new Object[capacity];
}
public boolean isEmpty()
{
if(size == 0)
{
return true;
}
else
{
return false;
}
}
public E [] dump()
{
E [] E2 = Arrays.copyOf(elementData, size);
for(int i = 0; i < size; i++)
{
elementData[i] = null;
}
size = 0;
return E2;
}
第一个错误:在这个错误中,主要是当我运行测试时说
AssertionFailedError: ensureCapacity未正常工作
private void ensureCapacity(int capacity)
{
if (size != capacity)
{
int newCapacity = (capacity * 2) + 1;
elementData[capacity] = elementData[newCapacity];
}
}
稍作更新,我会发布我的测试。你们可以查看它并让我知道,但是我根本不能修改我的测试。只有我的代码。我注释了第一行,因为这是我的错误发生的地方。
@Test
public void testEnsureCapacity()
{
assertEquals(2, ensureCapacity.getModifiers(), "ensureCapacity does not have the correct modifiers"); // My error occurs here currently.
try
{
for(int i=0; i<=10; ++i)
{
ensureCapacity.invoke(s, i);
assertEquals(10, ((Object[])elementData.get(s)).length, "ensureCapacity is not working correctly (capacity changing unnecessarily)");
}
ensureCapacity.invoke(s, 11);
assertEquals(21, ((Object[])elementData.get(s)).length, "ensureCapacity is not working correctly (capacity not increased correctly)");
Random rand = new Random();
int capacity = rand.nextInt(100)+1;
s = new Sack<Integer>(capacity);
for(int i=0; i<=capacity; ++i) {
ensureCapacity.invoke(s, i);
assertEquals(capacity, ((Object[])elementData.get(s)).length, "ensureCapacity is not working correctly (capacity changing unnecessarily)");
}
ensureCapacity.invoke(s, capacity+1);
assertEquals(capacity*2+1, ((Object[])elementData.get(s)).length, "ensureCapacity is not working correctly (capacity not increased correctly)");
} catch (Exception e) {
fail("ensureCapacity is not working correctly");
}
}
发布于 2019-03-06 06:44:29
我想出来了,这是我的问题的解决方案。
private void ensureCapacity(int capacity)
{
if (elementData.length < capacity)
{
int newCapacity = elementData.length * 2 + 1;
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
https://stackoverflow.com/questions/54974535
复制相似问题