《Java数据结构》ArraySet集合的实现

package cn.com.Inf;

import java.util.Iterator;


//接口
/*................要点
 * 集合的底层实现都是用数组实现的
 * 集合有不受数组长度的限制,当空间不足时会自动增加存储空间
 * Set集合是不能有重复元素
 * Set集合是非线性的
 * */
public interface SetADT<T> {
	public void add(T element);//添加元素
	public void addAll(SetADT<T> set);//把另一个集合中的元素添加到自己的集合中
	public T remove(T element);//删除元素
	public T removeRandom();//随机删除
	public boolean contains(T target);//判断是否有重复元素
	public boolean equals(SetADT<T> set);//判断两个集合里的元素是否相等
	public boolean isEmpty();//判断集合里是否有元素
	public SetADT<T> union(SetADT<T> set);//将两个集合  合并在一起
	public int size();//集合的大小
	public Iterator<T> iterator();//遍历集合需
	public String toString();//将集合中的元素变成字符串显示
}
package cn.com.MyArrayList;

import java.util.EmptyStackException;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Random;

import cn.com.Inf.SetADT;

public class MyArrayList<T> implements SetADT<T>{
	private T[] content;//定义数组
	private int count;//定义一个索引,相当于C,C++指针。
	private int initCapacity = 100;//数组初始化长度100
	Random r= new Random();//随机函数,在随机删除方法时需要用到
	
	  public MyArrayList(){
		count = 0;
		content =  (T[])(new Object[initCapacity]);//初始化一个100的数组
	}

	@Override
	public void add(T element) {
		// TODO Auto-generated method stub
		if(!contains(element)){ //判断是否有重复  ////*(必须)
			if(this.size() == content.length){
				expandContent();//数组空间不足      调用函数扩展空间	
			}	
			content[count] = element;
			count++;//添加至数组
		}
		
	}

	private void expandContent() {
		// TODO Auto-generated method stub
		//增加数组空间
		T[] target = (T[])(new Object[content.length*2]);
		for(int i = 0 ; i < content.length ; i++){
			target[i] = content[i];
		}
		target = content;
	}

	@Override
	public T remove(T element) {
		// TODO Auto-generated method stub
		boolean bool = false;
		int search = -1;
		if(isEmpty()){
			throw new EmptyStackException();//判断数组是否为空
		}
		for(int i = 0 ; i < content.length; i++){
			if(content[i].equals(element)){
				search = i;
				break;
			}
		}
		if(search == -1){
				throw  new NoSuchElementException();
		}
		//将最后一个元素替换当前要删除的元素,在将最后一个元素删除 count--
		T result = content[search];
		content[search] = content[count-1];
		content[count-1] = null;
		count--;
		return result;
	}

	@Override
	public T removeRandom() {
		// TODO Auto-generated method stub
		if(isEmpty()){
			throw new EmptyStackException();
		}
		//随机删除下标为    0-count-1   的elemnt
			int choice = r.nextInt(count);
			T result = content[choice];
			content[choice] = content[count-1];
			content[count-1] = null;
			count--;
			return result;
	}
	public boolean contains(T target) {
		// TODO Auto-generated method stub
		//遍历数组
		boolean bool =false;
		for(int i = 0; i < count; i++){
			if(content[i].equals(target)){
				bool = true;
			}
		}
		return bool;
	}

	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return(count==0);
	}
	
	@Override
	public int size() {
		// TODO Auto-generated method stub
		return count;
	}

	
	@Override
	public Iterator<T> iterator() {
		// TODO Auto-generated method stub
		//实例化
		return new ArrayIterator<T>(content,count);
	}

	@Override
	public boolean equals(SetADT<T> set) {
		// TODO Auto-generated method stub
		boolean result = false;
		//定义两个集合
		MyArrayList<T> temp1 = new MyArrayList<T>();
		MyArrayList<T> temp2 = new MyArrayList<T>();
		 //判断集合长度是否相等
		 T obj;
		 if(this.size() == set.size()){
			 temp1.addAll(this);
			 temp2.addAll(set);
			 Iterator<T> scan = set.iterator();
			 while(scan.hasNext()){
				 obj = scan.next();
				 if(temp1.contains(obj)){
					 temp1.remove(obj);
					 temp2.remove(obj);
				 }
			 }
			 //一个个删除
			 result = ((temp1.isEmpty())&&(temp1.isEmpty()));
		 }
		 return result;
	}


	@Override
	public SetADT<T> union(SetADT<T> set) {
		// TODO Auto-generated method stub
		//两个集合合并
		MyArrayList<T> both = new MyArrayList<T>();
		for(int i = 0 ; i < count ; i++){
			both.add(content[i]);
			}
			Iterator<T> scan = set.iterator();
			while(scan.hasNext()){
			both.add(scan.next());
		}
			return both;
	}

	
	
	public void addAll(SetADT<T> set) {
		// TODO Auto-generated method stub
		//一个个遍历再添加至集合
		Iterator<T> i = set.iterator();
		while(i.hasNext()){
			add(i.next());
		}
	}
	public String toString(){
		//将元素变为字符串
		String result = "";
		for(int i = 0 ; i < count; i++){
			result = result + content[i].toString()+ "\n";
		}
		return result;
		
	};

	
}
package cn.com.MyArrayList;

import java.nio.channels.UnsupportedAddressTypeException;
import java.util.Iterator;
import java.util.NoSuchElementException;

public class ArrayIterator<T> implements Iterator<T> {
	private T[] item;
	private int count;
	private int current;
	
	public ArrayIterator(T[] collection,int size){
		//初始化一个数组
		this.item = collection;
		this.count = size;
		current = 0;
	}
	@Override
	public boolean hasNext() {
		// TODO Auto-generated method stub
		//判断是否有下一个
		return (current < count);
	}

	@Override
	public T next() {
		// TODO Auto-generated method stub
		T result = null;
		if(hasNext()){
			result = item[current];
			current++;
		}else{
			throw new NoSuchElementException();
		}
		return result;
	}

	@Override
	public void remove() {
		// TODO Auto-generated method stub
		throw new UnsupportedOperationException();
	}

}


 
 
 

猜你喜欢

转载自blog.csdn.net/qq727366586/article/details/79223151