tags:

views:

106

answers:

3

Hey everybody I'm working with java, So I am writing a class called ordered set. It is a class that is cross between a set and a queue. In other words, it is a queue without any duplicates. So I know I have to implement the Iterable interface, and write an iterator method. To write the method I have to then implement the iterator interface.

package comp345;
import java.util.Iterator;
import java.util.NoSuchElementException;

class OrderedSet implements  Iterable<Object>
{
    private Object[] queue;  //This is how the OrderedSet is represented,  a queue of Objects 
    private int counter;     //Counter to keep track of current position of queue
    private int queueSize;   //Keep track of the queue;

    //Constructor
    public OrderedSet(int size)
    {
     this.queue = new Object[size];
     this.counter = 0;
     this.queueSize = size - 1;


     //Instantiate each instance of the object in the object array
     for(int i = 0; i < queue.length; i++)
     {
      queue[i] = new Object();
     }

    }


    /**
     * Ensures that this collection contains the specified element.  If it
     * is not already in the collection it is added it to the back of the queue.
     * @param  e element whose presence in this collection is to be ensured
     * @return true if this collection changed as a result of the call
     * @throws NullPointerException if the specified element is null
     */
    boolean add( Object i )
    {

     if(  i == queue[counter])
     {

      return false;
     }

     else if( i == null )
      throw  new NullPointerException();

     else
     {
      queue[counter] = i;    //Add Object to back of Queue
      return true;
     }
    }

    /**
     * Removes all of the elements from this collection.  The collection will be
     * empty after this method returns.
     */
    void clear()
    {
     for(int i = 0; i < queue.length; i++)
     {
      queue[i] = null;
     }


    }

    /**
     * Returns true if this collection contains no elements.
     * @return true if this collection contains no elements
     */
    boolean isEmpty()
    {
     if(queue[0] == null)
      return true;
     else
      return false;

    }

    /**
     * Retrieves, but does not remove, the head of this queue, or returns null
     * if this queue is empty
     * @return the head of this queue, or null if this queue is empty
     */
    Object peek()
    {
     if(queue[counter] != null )
      return queue[counter];
     else
      return null;
    }

    /**
     * Retrieves and removes the head of the queue.
     * @return the head of this queue
     * @throws NoSuchElementException if this queue is empty
     */
    Object remove()
    {
     if(queue[0] != null )
     {
      Object temp = queue[0];

      queue[0] = queue[1];

      return temp;

     }
     else
      throw new NoSuchElementException();
    }



    public class SetIterator implements Iterator<Object>
    {
     private int counter;


     public SetIterator() 
     {
      this.counter = 0;
     }


     @Override
      public Object next()
      {

       counter ++;

       if(queueSize == counter)
        return null;


       else if(queue[counter] != null)
        return (Object) queue[counter];


       else
        throw new NoSuchElementException();


      }

                           @Override
      public boolean hasNext()
      {
                               counter++;

                if(queueSize < counter)
                    return false;

                else if(queue[counter] != null)
        return  true;

        return false;

      }


                        @Override
      public void remove()
      {
       throw  new UnsupportedOperationException();

      }


    }

        @Override
    public Iterator<Object> iterator()
    { 
     return new SetIterator();

    }
   public static void main(string args[])
   {
       OrderedSet os;
       os.add("hello");
       os.add(4);
       os.add("bye");


 for(Object o: os)
 {

     System.out.println(o);

  }


}

}

A: 

Ok my question is, supposed I when I add main and then try to use the for each loop with my class, it wouldn't work public static void main(string args[] ) { OrderedSet os; os.add("hello"); os. add(4); os.add("bye");

for(Object o: os) { System.out.println(o); } }

ProxyProtocol
Please don't use answers to augment questions; just edit your question and delete this answer (that is vote to delete and it will be done).
Software Monkey
+4  A: 

I can see at least one problem. Take a closer look at your hasNext() method. Do you really want to increment counter?

hallidave
+1  A: 

The problem with your code is here:

 OrderedSet os;       
 os.add("hello");

You have declared a reference of os, but you haven't assigned it anything. The compiler won't allow this. You have to do:

 OrderedSet os = new OrderedSet(10);

There are other problems with your code (@hallidave found one) but that is the first problem.

In general when you have a problem with an error, you should ask with more information than "it doesn't work." The exact error message will go a long way to answering the question. I know compiler error messages don't mean much to you yet, but when you get more experience they will.

Yishai