MyHashSet
主要用作数据去重
IHashSet interface
定义接口
package _10_Hash;
import java.util.Iterator;
public interface IHashSet<E> {
void add(E key);
E remove(E key);
void clear();
boolean contains(E key);
boolean isEmpty();
int size();
Iterator<E> iterator();
}
IHashSet
set只有一个值同时 可以去重所以作为key值
和map类似 所以直接调用MyHashMap中写好的方法
这次的MyHashMap中加入了Iterate 迭代器
Set的Iterate也是直接调用Map的
和修复了一些小BUG
package _10_Hash;
import java.util.Iterator;
public class MyHashSet<E> implements IHashSet<E> {
private MyHashMap<E, E> map = new MyHashMap<>();
@Override
public void add(E key) {
map.put(key, null);//只需要Key即可
}
@Override
public E remove(E key) {
return map.remove(key);
}
@Override
public void clear() {
map.clear();
}
@Override
public boolean contains(E key) {
return map.containsKey(key);
}
@Override
public boolean isEmpty() {
return map.isEmpty();
}
@Override
public int size() {
return map.size();
}
@Override//调用map的迭代器
public Iterator<E> iterator() {
Iterator<MyHashMap.Node> iter = map.iterator();
return new Iterator<E>() {
@Override
public boolean hasNext() {
return iter.hasNext();
}
@Override
public E next() {
return (E) iter.next().key;
}
};
}
@Override
public String toString() {
Iterator<MyHashMap.Node> iterator = map.iterator();
StringBuilder sb = new StringBuilder();
if (iterator.hasNext() == false)
return null;
while (iterator.hasNext()) {
sb.append(iterator.next().key + ",");
}
return sb.toString();
}
}
内部类迭代
//内部类迭代器
private class MapIterator implements Iterator<MyHashMap.Node> {
int i = 0;
Node p = buckets[0];
@Override
public boolean hasNext() {
while (p == null && i < N) {
i++;
if (i == N)
p = null;
else
p = buckets[i];
}
//i是一个非空的桶子 p是链表头
return p != null;
}
@Override
public Node next() {
Node res = p;
p = p.next;
return res;
}
}
@Override
public Iterator<MyHashMap.Node> iterator() {
return new MapIterator();
}
Test
package _10_Hash;
import org.junit.Before;
import org.junit.Test;
import java.util.Iterator;
public class MyHashSetTest {
MyHashSet<Integer> set = new MyHashSet<>();
@Before
public void add() {
set.add(1);
set.add(2);
set.add(3);
set.add(1);
}
@Test
public void remove() {
System.out.println(set);
set.remove(1);
System.out.println(set);
}
@Test
public void clear() {
set.clear();
System.out.println(set);
}
@Test
public void contains() {
System.out.println(set.contains(1));
System.out.println(set.contains(66));
}
@Test
public void isEmpty() {
System.out.println(set.isEmpty());
set.clear();
System.out.println(set.isEmpty());
}
@Test
public void size() {
System.out.println(set.size());
set.remove(1);
System.out.println(set.size());
System.out.println(set);
set.clear();
System.out.println(set.size());
System.out.println(set);
}
@Test
public void iter() throws Exception {
Iterator<Integer> iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
}
}
本文作者:Author: 寒光博客
文章标题:[java]HashSet的简单实现
本文地址:https://www.dxoca.cn/java/314.html 百度已收录
版权说明:若无注明,本文皆为“Dxoca's blog (寒光博客)”原创,转载请保留文章出处。
本文地址:https://www.dxoca.cn/java/314.html 百度已收录
版权说明:若无注明,本文皆为“Dxoca's blog (寒光博客)”原创,转载请保留文章出处。