mdbuzz
mdbuzz

Reputation: 61

adding an iterator to my arraylist

import java.util.Iterator;

public class MyArrayList<E> implements Iterable<E> {
    public static final int DEFAULT_SIZE = 5;
    public static final int EXPANSION = 5;
    private int capacity;
    private int size;
    private Object[] items;

    public MyArrayList() {
        size = 0;
        capacity = DEFAULT_SIZE;
        items = new Object[DEFAULT_SIZE];
    }

    private void expand() {
        Object[] newItems = new Object[capacity + EXPANSION];
        for (int j = 0; j < size; j++) newItems[j] = items[j];
        items = newItems;
        capacity = capacity + EXPANSION;
    }

    public void add(Object obj) {
        if (size >= capacity) this.expand();
        items[size] = obj;
        size++;
    }

    public int size() {
        return size;
    }

    public Object get(int index) {
        try{
            return items[index];
            } catch(IndexOutOfBoundsException e){
                System.out.println("Exception Thrown: " + "Index is out of bound");
            }
            return index;
    }

    public boolean contains(Object obj) {
        for (int j = 0; j < size; j++) {
            if (obj.equals(this.get(j))) return true;
        }
        return false;
    }

    public void add(int index, Object obj) {
        try{
            if (size >= capacity) this.expand();
            for (int j = size; j > index; j--) items[j] = items[j - 1];
            items[index] = obj;
            size++;
              } catch(IndexOutOfBoundsException e){
                System.out.println("Exception Thrown: " + "Index is out of bound");
              }
            return;
    }

    public int indexOf(Object obj) {
        for (int j = 0; j < size; j++) {
            if (obj.equals(this.get(j))) return j;
        }
        return -1;
    }

    public boolean remove(Object obj) { 
        for (int j = 0; j < size; j++) {
            if (obj.equals(this.get(j))) {
                for (int k = j; k < size-1; k++) items[k] = items[k + 1];
                size--;
                items[size] = null;
                return true;
            }
        }
        return false;
    }

    public Object remove(int index) {
        try{
            Object result = this.get(index);
            for (int k = index; k < size-1; k++) items[k] = items[k + 1];
            items[size] = null;
            size--;
            return result;
             } catch(IndexOutOfBoundsException e){
                System.out.println("Exception Thrown: " + "Index is out of bound");
              }
            return index;
    }

    public void set(int index, Object obj) {
        try{
            items[index] = obj;
             } catch(IndexOutOfBoundsException e){
                System.out.println("Exception Thrown: " + "Index is out of bound");
             }
            return;
    }




public Iterator<E> iterator() {

    return new MyIterator<E>();
}

public class MyIterator <T> implements Iterator<T>{
    public boolean hasNext(){

    }

public T next(){

}

public void remove(){

    }
}


}

Basically I'm trying to improve the functionality of my arraylist, as it uses for loops for methods such as add and remove, however I am trying to use an iterator instead and I searched it up and I found out you cannot just simply add implements iterable to the main class, it has to be implemented by using three methods next(), hasNext() and remove(). I added the three methods at the bottom of the code but i'm really not sure how I implement it in order for it to begin to work.

Upvotes: 1

Views: 547

Answers (3)

Blip
Blip

Reputation: 3171

You need to pass the items array to your MyIterator class so that you can keep track of the current position of the cursor in the array. Now based on the current position of the cursor you could implement all the abstract methods.

In the constructor of the MyIterator class pass the array as a parameter as public MyIterator(E[] array) and store the array as a local variable. also create a local variable cursor and set its value to 0.

Upvotes: 0

BretC
BretC

Reputation: 4209

Here is an example (NOTE: I have not tried to compile this or anything so please update this post if you find any errors!)

public class MyArrayList<E> implements Iterable<E> {
    ...

    @Override
    public Iterator<E> iterator() {
        return new Iterator<E>() {
            private Object[] currentData = items;
            private int pos = 0;

            @Override
            public boolean hasNext() {
                return pos < currentData.length;
            }

            @Override
            public E next() {
                return (E) currentData[pos++];
            }

            @Override
            public void remove() {
                MyArrayList.this.remove(pos++);
            }
        };
    }
}

Upvotes: 0

Robert Bain
Robert Bain

Reputation: 9586

You'll need to keep track of the index in the items array that the Iterator is on. Let's call it int currentIndex. hasNext() will return true if currentIndex < size. next() will increment currentIndex if hasNext() is true and return items[currentIndex], otherwise it should throw an Exception, say NoSuchElementException. Remove will call remove(currentIndex).

Upvotes: 2

Related Questions