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

亚当·维韦罗

所以,我正在创建一个名为“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:grab 工作不正常(检查空麻袋)==>

Expected: null

Actual : [Ljava.lang.Object;@76908cc0

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

抓取方法应该从麻袋中随机取出并返回一个物品。如果不存在任何项目,则应返回 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() 是因为当它第一次被调用时,它会创建一个新的伪随机数生成器,然后这个生成器用于所有对这个方法的调用。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在 Java 中创建处理数组泛型的 ensureCapacity 方法

来自分类Dev

如何在Java中创建泛型的固定大小的数组?

来自分类Dev

如何在Java中创建泛型类的实例?

来自分类Dev

如何在Java中实现泛型方法

来自分类Dev

如何在Java中使用泛型复制数组

来自分类Dev

如何使用泛型处理字典和数组

来自分类Dev

如何在Java中为复杂的泛型类型创建别名?

来自分类Dev

如何在Java方法中使用泛型

来自分类Dev

如何在Java的main方法中创建静态数组?

来自分类Dev

如何在Java中推断泛型类型?

来自分类Dev

如何在Java中实例化泛型类型?

来自分类Dev

如何实现Java方法在Scala中返回使用数组参数化的泛型类型?

来自分类Dev

如何在JAVA中的泛型类中使用override方法

来自分类Dev

Java-如何创建调用接口方法的泛型类?

来自分类Dev

如何获取Java中泛型数组的值?

来自分类Dev

如何在Java中创建通用方法?

来自分类Dev

如何在Java中将泛型列表类作为参数传递给泛型方法?

来自分类Dev

如何在Java中将泛型列表类作为参数传递给泛型方法?

来自分类Dev

如何正确创建在Java中扩展泛型接口的有界泛型类

来自分类Dev

如何在C#中创建泛型方法重载?

来自分类Dev

如何从泛型方法参数中获取Java类?

来自分类Dev

如何在Java中创建类型安全的通用数组?

来自分类Dev

我如何在Java脚本中创建对象数组

来自分类Dev

如何在Java 8中从String数组创建BigDecimal流?

来自分类Dev

如何在全局中创建布尔数组-Java

来自分类Dev

如何在 JAVA 中创建二维字符数组

来自分类Dev

如何在Java 8中处理Currency?

来自分类Dev

如何在Java中处理Github Webhook?

来自分类Dev

如何在Java中处理极小的数字

Related 相关文章

热门标签

归档