gpt4 book ai didi

java - 如何在 Java 中创建处理泛型和数组的抓取方法

转载 作者:行者123 更新时间:2023-12-02 10:11:24 25 4
gpt4 key购买 nike

因此,我正在创建一个名为“Sack”的通用数据结构。在此,我将元素添加到麻袋中,抓取随机元素,查看它是否为空,或转储其内容等。此外,我将其创建为可扩展以容纳所需数量的元素。

我需要创建一个抓取方法,该方法应该随机地从袋子中移除并返回一个项目。如果不存在任何项目,则应返回 null。

我的代码如下:

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 void add(E item)
{
int index = size++;
if(size >= elementData.length-1)
{
elementData = Arrays.copyOf(elementData, size);
}
elementData[index] = item;
}
public E [] dump()
{
E [] E2 = Arrays.copyOf(elementData, size);
for(int i = 0; i < size; i++)
{
elementData[i] = null;
}
size = 0;
return E2;
}

我的抓取方法就在这里。

public E [] grab()
{
E [] E2 = Arrays.copyOf(elementData, size);
return elementData;
}

这是不正确的,当我运行测试时,我收到一条错误,指出 AssertionFailedError:抓取无法正常工作(用空麻袋检查)==>

预期:空

实际:[Ljava.lang.Object;@76908cc0

我的测试就在这里,我无法修改我的测试,只能修改提供的代码,因为那里有错误,我需要有关我之前所说的帮助:

grab 方法应该随机地从袋子中取出并返回一个元素。如果没有元素目前,它应该返回 null

因此,这是我的测试:

 @Test
public void testGrab()
{
assertNull(s.grab(), "grab is not working correctly (check with empty sack)");
Random rand = new Random();
int numElements = rand.nextInt(9) + 1;
Integer[] setElementData = new Integer[10];
ArrayList<Integer> expectedElements = new ArrayList<Integer>();
int randElement;
for(int i=0; i<numElements; ++i) {
randElement = rand.nextInt(50) + 1;
if(!expectedElements.contains(randElement)) {
setElementData[i] = randElement;
expectedElements.add(randElement);
} else {
--i;
}
}
try {
elementData.set(s, setElementData);
size.set(s, numElements);
for(int i=0; i<numElements; ++i) {
expectedElements.remove(s.grab());
assertEquals(numElements-i-1, size.get(s), "grab is not working correctly (check size usage)");
}
assertEquals(0, expectedElements.size(), "grab is not working correctly (check size usage)");
} catch (Exception e) {
fail("grab is not working correctly");
}
}

如果您对我的抓取方法有任何关于如何完成此任务的解决方案,请告诉我。

最佳答案

我不明白为什么你的抓取方法返回一个数组而不是单个元素。我可以建议您采用不同的方法

public class Sack<E> {
private final static int DEFAULT_CAPACITY = 10;
private final static float REALLOC_FACTOR = 1.5f;
private E[] elementData;
private int size;

public Sack() {
this(DEFAULT_CAPACITY);
}
@SuppressWarnings("unchecked")
public Sack(int capacity) {
if(capacity <= 0)
throw new IllegalArgumentException("capacity " + capacity);
elementData = (E[]) new Object[capacity];
}
public boolean isEmpty() {
return size == 0;
}
public void add(E item) {
int index = size++;
if(size > elementData.length-1)
elementData = Arrays.copyOf(elementData, (int)(size*REALLOC_FACTOR));
elementData[index] = item;
}
public E [] dump() {
E [] E2 = Arrays.copyOf(elementData, size);
Arrays.fill(elementData, null);
size = 0;
return E2;
}
public E grab() {
if(size == 0)
return null;
int index = (int)(Math.random()*size);
E element = elementData[index];
elementData[index] = elementData[size-1];
elementData[size-1] = null;
size--;
return element;
}
}

此抓取方法背后的想法是选择一个随机索引 rand (从 0 到 effectiveSize-1)并返回此元素,但在此之前我们必须将此元素与最后一个元素交换(索引为 effectiveSize-1 的元素并减小有效大小。我使用了 Math.rand(),因为第一次调用它时,它会创建一个新的伪随机数生成器,然后此生成器将用于对此方法的所有调用。

注意:我还添加了一个重新分配因子,以避免在数组饱和后对每个元素重新分配数组。

关于java - 如何在 Java 中创建处理泛型和数组的抓取方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54977577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com