Adan Vivero
Adan Vivero

Reputation: 422

How to add items into an Array Generic Object from the parameter in Java

So, I am creating a generic data structure named "Sack". In this I add items to a sack, grab a random item, see if it's empty, or dump out its contents etc. Also I'm creating it to expand to hold as many items as needed.

Currently, I'm working on the add method and I'm having troubles on my add method, and I am trying to think of a way adding what's in my parameter into the sack.

import java.util.Arrays;

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

In this method, I am trying to add item, into my sack. When I run my tests, I am told it's incorrect. If there's a way to improve this.

    public void add(E item)
    {
        elementData[size] = item;
        size++;
    }

elementData is what I am adding the items into.

Update

I updated my add method to look like this.

public void add(E item)
{
        if(size >= elementData.length-1)
        {
            elementData[size] = item;
            size++;
        }
}

The message I am now receiving is that add is not working correctly and to check size usage.

Upvotes: 0

Views: 441

Answers (4)

Adan Vivero
Adan Vivero

Reputation: 422

Here's another way of doing this,

public void add(E item) 
{
    ensureCapacity(size+1);
    elementData[size] = item;
    size++;
}

This also works, but I would have to modify the ensureCapacity method accurately, which I have.

Upvotes: 0

Adan Vivero
Adan Vivero

Reputation: 422

So after numerous tries, I give credit to @rockfarkas for solving this. I put in the following code and it solved my add method code.

public void add(E item)
{
    int index = size++;
    if(size >= elementData.length-1)
    {
        elementData = Arrays.copyOf(elementData, size);
    }
    elementData[index] = item;
}

Upvotes: 0

rockfarkas
rockfarkas

Reputation: 132

You cannot ensure capacity of Java arrays, Javascript can! You can create a new one and copy:

public void add(E element) {

    int index = size++;
    if(size >= elementData.length-1) {

        // it ensures elementData
        elementData = java.util.Arrays.copyOf(elementData, size);
    }
    elementData[index] = element;
}

or skip ensure of array capacity and change the check direction:

public void add(E element) {

    if(size < elementData.length-1) {

        elementData[size++] = element;
    }
    // TODO else notice of the unsuccessfull add
}

Upvotes: 1

rzwitserloot
rzwitserloot

Reputation: 103293

It sounds like there's a spec for what your Sack is supposed to do that you did not paste.

It also sounds like your add method is supposed to just work, even if the sack is already at capacity.

That means you need to make a new array, copy over all elements, and then replace the array you have in your Sack instance with the new one (because java arrays cannot grow or shrink).

Look at the source of of java's own ArrayList for a hint on how that's done.

Upvotes: 1

Related Questions