手写 HashSet的底层 和 迭代器

  1 package Test.CollectionIterator;
  2 import java.util.Iterator;
  3 public class MyHashSet2<E> implements Iterable<E>{
  4     //1.数组+链表 一个add 方法
  5     private Node[] arr;
  6     private int size;//返回list中的元素个数
  7     public int size() {
  8         return size;
  9     }
 10     public boolean add(E e) {
 11         boolean flag = false;
 12         //1.判断arr数组是否存在 不存在就创建 存在就添加
 13         if (arr == null) {
 14             arr = new Node[16];//1.1不存在 创建
 15         }
 16         //1.2 添加
 17         //2.根据分组的下标判断 数组下标处 有没有node元素
 18         int index = e.hashCode() % 16;
 19         if (arr[index] == null) {
 20             arr[index] = new Node(e, null);//2.1没有直接创建
 21             size++;
 22             flag = true;
 23         } else {//2.2有的话比较
 24             //3.如果hash值和equals值相等 就不添加 否则添加
 25             Node node = arr[index];
 26             E e1 = (E)node.getE();
 27             Node next;
 28             do {//3.1循环判读是否相等相等就不添加
 29                 if (e1.hashCode() == e.hashCode() && e1.equals(e)) {
 30                     return flag;//相等不添加
 31                 }//
 32                 next = node.getNext();
 33                 if (next != null) {
 34                     e1 = (E)next.getE();
 35                 }
 36             } while (next != null);//这步是比较完数组某个链表上的全部元素
 37             //3.2不相等 开始添加
 38             arr[index] = new Node(e, node);//2.1没有直接创建
 39             size++;
 40             flag = true;
 41         }
 42         return flag;
 43     }
 44     @Override
 45     public Iterator<E> iterator() {
 46         return new Itr();
 47     }
 48     private class Itr<E> implements Iterator{
 49         private int curser;//记录 节点数组 的下标
 50         private  int count;
 51         private Node currentNode;
 52 
 53         @Override
 54         public boolean hasNext() {
 55             return count!=size;
 56         }
 57 
 58         @Override
 59         public E next() {
 60             if (count>=size){
 61                 throw  new RuntimeException("没有找到下一个");
 62             }
 63           currentNode=arr[curser];
 64             if(currentNode==null){
 65                 while (true){
 66                     curser++;
 67                     if(curser>16)throw  new RuntimeException("没有找到下一个");
 68                     currentNode=arr[curser];
 69                     if(currentNode==null){
 70                         curser++;
 71                     }else {
 72                         count++;
 73                         return (E) currentNode.getE();
 74                     }
 75                 }
 76             }else{
 77                 count++;
 78                 Node now =currentNode;
 79                 if (currentNode.getNext()==null){
 80                    curser++;
 81                 }else {
 82                     currentNode=currentNode.getNext();
 83                 }
 84                 return (E)now.getE();
 85   /*              count++;
 86                 if (currentNode.getNext()==null){
 87                     curser++;
 88                 }else {
 89                     currentNode=currentNode.getNext();
 90                 }//这刚好链表上只有一个元素 没有修改currentNode 自己写bug
 91                 return currentNode.getE();*/
 92             }
 93         }
 94     }
 95     // 该内部类 实现 链表结构
 96     private class Node<E> {
 97         private E e;
 98         private Node next;
 99         public Node() {
100         }
101         public Node(E e, Node next) {
102             this.e = e;
103             this.next = next;
104         }
105         public E getE() {
106             return e;
107         }
108         public void setE(E e) {
109             this.e = e;
110         }
111         public Node<E> getNext() {
112             return next;
113         }
114         public void setNext(Node<E> next) {
115             this.next = next;
116         }
117     }
118 }

 

posted @ 2022-06-26 11:44  ACMAN-Mr.Lee  阅读(51)  评论(0编辑  收藏  举报