ArrayAsSet.java

package eu.javaexperience.collection.set;

import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.Set;

public class ArrayAsSet<T> implements Set<T>
{
	Object[] arr;
	int ep = 0;
	int vals = 0;
	
	
	public ArrayAsSet()
	{
		arr = new Object[8];
	}
	
	ArrayAsSet(T[] arr,int ep,int vals)
	{
		this.arr = arr;
		this.ep = ep;
		this.vals = vals;
	}
	
/*	
	public ArraySet(T[] arr)
	{
		this(Arrays.copyOf(arr, arr.length),arr.length);
	}
	
	private ArraySet(T[] arr,int ep)
	{
		this.arr = arr;
		this.ep = ep;
		for(int i=0;i<ep;i++)
			if(arr[i] != null)
				vals++;
	}
*/	
	@Override
	public int size()
	{
		return vals;
	}

	@Override
	public boolean isEmpty()
	{
		return vals == 0;
	}

	@Override
	public boolean contains(Object paramObject)
	{
		for(int i=0;i<ep;i++)
			if(paramObject.equals(arr[i]))
				return true;
		
		return false;
	}

	@Override
	public Iterator<T> iterator()
	{
		return new Iterator<T>()
		{
			int rets = 0;
			int cep = 0;
			@Override
			public boolean hasNext()
			{
				return rets < vals;
			}

			@Override
			public T next()
			{
				for(int i=cep;i<ep;i++)
				{
					if(arr[i] != null)
					{
						cep = i+1;
						rets++;
						return (T) arr[i];
					}
				}
				return null;
			}

			@Override
			public void remove()
			{
				ArrayAsSet.this.remove(arr[cep-1]);
			}
		};
	}

	@Override
	public Object[] toArray()
	{
		Object[] ret = new Object[vals];
		int ep = 0;
		for(int i=0;i<ep;i++)
		{
			if(arr[i] != null)
			{
				ret[ep++] = arr[i];
			}
		}
		return ret;
	}

	@Override
	public <T> T[] toArray(T[] paramArrayOfT)
	{
		T[] ret = Arrays.copyOf(paramArrayOfT, vals);
		int ep = 0;
		for(int i=0;i<ep;i++)
			if(arr[i] != null)
				ret[ep++] = (T) arr[i];
		
		return ret;
	}
	
	protected void inc()
	{
		if(ep == arr.length)
			arr = Arrays.copyOf(arr, arr.length*2);
	}

	@Override
	public boolean add(T paramE)
	{
		for(int i=0;i<ep;i++)
			if(paramE.equals(arr[i]))
				return false;
		
		if(ep == vals)
		{
			arr[ep++] = paramE;
			vals++;
			inc();
		}
		else
			for(int i=0;i<ep;i++)
				if(arr[i] == null)
				{
					arr[i] = paramE;
					vals++;
					break;
				}
		
		return true;
	}

	@Override
	public boolean remove(Object paramObject)
	{
		for(int i=0;i<ep;i++)
			if(paramObject.equals(arr[i]))
			{
				arr[i] = null;
				vals--;
				if(i == ep -1)
					ep--;

				return true;
			}
	
		return false;
	}

	@Override
	public boolean containsAll(Collection<?> paramCollection)
	{
		kint:for(Object o:paramCollection)
		{
			for(int i=0;i<ep;i++)
				if(o.equals(arr[i]))
					continue kint;
			
			return false;
		}
		
		return true;
	}

	@Override
	public boolean addAll(Collection<? extends T> paramCollection)
	{
		boolean ret = true;
		for(T o:paramCollection)
			ret &= add(o);

		return ret;
	}

	@Override
	public boolean retainAll(Collection<?> paramCollection)
	{
		boolean ret = true;
		kint:for(int i=0;i<ep;i++)
			{
			if(arr[i] != null)
				for(Object o:paramCollection)
					if(arr[i].equals(o))
						continue kint;
		
				remove(arr[i]);
				ret = false;
			}						
						
		return ret;
	}

	@Override
	public boolean removeAll(Collection<?> paramCollection)
	{
		boolean ret = true;
		for(Object o:paramCollection)
			ret &= remove(o);
		
		return ret;
	}

	@Override
	public void clear()
	{
		for(int i=0;i<ep;i++)
			arr[i] = null;
		
		ep = 0;
		vals = 0;
	}

}