哈希表代码实现
package com.gykalc.hashtable;
import java.util.Iterator;
public class HashTableDemo {
public static void main(String[] args) {
MyHashTable<String, String> myHashTable = new MyHashTable<>();
myHashTable.put("NO001", "贵永康");
myHashTable.put("NO002", "刘畅");
myHashTable.put("123", "444");
System.out.println(myHashTable.get("NO002"));
System.out.println(myHashTable.get("NO003"));
System.out.println(myHashTable.toString());
}
static class MyHashTable<K, V> {
private static final int DEFAULT_CAPITAL = 16;
private int capital;
private int size;
private MyLinkedList<Node>[] nodeListArray;
public MyHashTable() {
this(DEFAULT_CAPITAL);
}
public MyHashTable(int capital) {
this.capital = capital;
nodeListArray = new MyLinkedList[capital];
}
public void put(K key, V value) {
int n = hash(key);
Node newNode = new Node<>(key, value);
if (nodeListArray[n] == null) {
nodeListArray[n] = new MyLinkedList<>();
}
nodeListArray[n].add(newNode);
this.size++;
}
public V get(K key) {
int n = hash(key);
if (nodeListArray[n] != null) {
Iterator<Node<K, V>> it = nodeListArray[n].iterator();
while(it.hasNext()) {
Node<K, V> next = it.next();
if (next.key.equals(key)) {
return next.value;
}
}
}
return null;
}
public int hash(K key) {
return key.hashCode() % capital;
}
class Node<K, V> {
private K key;
private V value;
public Node(K key, V value) {
this.key = key;
this.value = value;
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("MyHashTable{");
for (int i = 0; i < capital; i++) {
if (nodeListArray[i] == null) {
break;
}
Iterator<Node<K, V>> iterators = nodeListArray[i].iterator();
while (iterators.hasNext()) {
Node<K, V> next = iterators.next();
sb.append(next.key.toString() + ": " + next.value + ", ");
}
}
sb.delete(sb.lastIndexOf(","), sb.length());
sb.append("}");
return sb.toString();
}
}
}
class MyLinkedList<E> implements Iterable{
private Node head = null;
private int size = 0;
class MyLinkedListIterator implements Iterator {
private int index = 0;
@Override
public boolean hasNext() {
return index < size();
}
@Override
public E next() {
E e = get(index);
index++;
return e;
}
}
public void add(E e) {
Node newNode = new Node(e);
if (head == null) {
head = newNode;
}else {
Node temp = head;
while(temp.next != null) {
temp = temp.next;
}
temp.next = newNode;
}
this.size++;
}
public E get(int index) {
int i = 0;
Node temp = head;
while(temp != null) {
if (index == i) {
break;
}
i++;
temp = temp.next;
}
if (temp != null) {
return temp.e;
}else {
return null;
}
}
public int size() {
return this.size;
}
public void remove(E e) {
Node temp = head;
Node preNode = temp;
while(temp != null && !temp.e.equals(e)) {
if (temp.next == null) {
break;
}
preNode = temp;
temp = temp.next;
}
if (temp != null && temp.e.equals(e)) {
if (preNode == head) {
head = null;
this.size--;
}else {
preNode.next = temp.next;
this.size--;
}
}
}
public void list() {
Node temp = head;
while(temp != null) {
System.out.print(temp.e + " ");
temp = temp.next;
}
}
@Override
public Iterator iterator() {
return new MyLinkedListIterator();
}
class Node {
private E e;
private Node next;
public Node(E e) {
this.e = e;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
}