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