簡體   English   中英

如何在Java中創建處理泛型和數組的抓取方法

[英]How to create a grab method in Java that deals with Generics and Arrays

因此,我正在創建一個名為“ 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:抓斗無法正常工作(檢查空麻袋)==>

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");
    }
}

讓我知道您是否對我的抓取方法有任何解決方案,以了解如何完成此任務。

我不明白為什么您的grab方法返回一個數組而不是單個元素。 我可以建議您使用其他方法

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;
    }
}

(from 0 to effectiveSize-1) and to return this element, but before we have to swap this element with the last element (the element with index effectiveSize-1) and reduce the effective size. 這個抓取方法的思想是選擇一個隨機索引 (從0到有效大小1)並返回此元素,但是在我們必須將此元素與最后一個元素(索引有效大小為1的元素)交換並減小之前有效尺寸。 我之所以使用Math.rand(),是因為它在首次調用時會創建一個新的偽隨機數生成器,然后將此生成器用於此方法的所有調用。

注意:我還添加了一個重新分配因子,以避免在數組飽和后為每個元素重新分配數組。

這是更簡單分解的答案。 我感謝@Mirko Alicastro。

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;
}

這是解決此方法的另一種方法,

public E grab()
{
      if(isEmpty())
      {
         return null;
      }
      Random rand = new Random();
      int i = rand.nextInt(size);
      E item = elementData[i];
      remove(i);
      return item;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM