`
baby69yy2000
  • 浏览: 187863 次
  • 性别: Icon_minigender_1
  • 来自: 自己输入城市...
社区版块
存档分类
最新评论

Hash类的实现

    博客分类:
  • Util
阅读更多
package Hash;
import java.util.ConcurrentModificationException;
import java.util.NoSuchElementException;
import MyInterface.*;

/**
 * Hash类的实现
 */
public class Hash<T> implements Collection<T> {

	// ----------------------------------------------------------------
	// 结点类
	private static class Entry<T> {
		T value;
		int hashValue;
		Entry<T> next;

		public Entry(T value, int hashValue, Entry<T> next) {
			this.value = value;
			this.hashValue = hashValue;
			this.next = next;
		}
	}

	// ----------------------------------------------------------------
	// Hash类实例变量
	private Entry[] table;
	private int hashTableSize;
	private final double MAX_LOAD_FACTOR = 0.75;
	private int tableThreshold;
	private int modCount = 0;

	// Hash类构造函数
	public Hash() {
		table = new Entry[17];
		hashTableSize = 0;
		tableThreshold = (int) (table.length * MAX_LOAD_FACTOR);
	}

	// ----------------------------------------------------------------
	// add()方法
	public boolean add(T item) {
		int hashValue = item.hashCode() & Integer.MAX_VALUE, index = hashValue
				% table.length;
		Entry<T> entry;
		entry = table[index];

		while (entry != null) {
			if (entry.value.equals(item))
				return false;
			entry = entry.next;
		}
		modCount++;
		entry = new Entry<T>(item, hashValue, (Entry<T>) table[index]);
		table[index] = entry;
		hashTableSize++;
		if (hashTableSize >= tableThreshold)
			rehash(2 * table.length + 1);
		return true;
	}

	// 散列表的再散列
	private void rehash(int newTableSize) {
		Entry[] newTable = new Entry[newTableSize], oldTable = table;
		Entry<T> entry, nextEntry;
		int index;

		for (int i = 0; i < table.length; i++) {
			entry = table[i];
			if (entry != null) {
				table[i] = null;
				do {
					nextEntry = entry.next;
					index = entry.hashValue % newTableSize;
					entry.next = newTable[index];
					newTable[index] = entry;
					entry = nextEntry;
				} while (entry != null);
			}
		}
		table = newTable;
		tableThreshold = (int) (table.length * MAX_LOAD_FACTOR);
		oldTable = null;
	}

	// remove()方法
	public boolean remove(Object item) {
		int index = ((item.hashCode() & Integer.MAX_VALUE)) % table.length;
		Entry<T> curr, prev;
		curr = table[index];
		prev = null;
		while (curr != null) {
			if (curr.value.equals(item)) {
				modCount++;
				if (prev != null)
					prev.next = curr.next;
				else
					table[index] = curr.next;
				hashTableSize--;
				return true;

			} else {
				prev = curr;
				curr = curr.next;
			}
		}
		return false;
	}

	public void clear() {
		int len = table.length;
		for (int i=0;i < len; i++)
			table[i] = null;
		modCount++;
		hashTableSize = 0;
	}

	public boolean contains(Object item) {
		int index = (item.hashCode() & Integer.MAX_VALUE) % table.length;
		Entry<T> entry;
		entry = table[index];
		while (entry != null) {
			if (entry.value.equals(item))
				return true;
			entry = entry.next;
		}
		return false;
	}

	public boolean isEmpty() {
		return hashTableSize == 0;
	}

	public Iterator<T> iterator() {
		return new MyIterator();
	}

	public int size() {
		return hashTableSize;
	}

	public Object[] toArray() {
		Object[] arr = new Object[hashTableSize];
		Iterator<T> iter = iterator();
		for(int i = 0; iter.hasNext(); i++)
			arr[i] = iter.next();
		return arr;
	}
	
	public String toString() {
		int max = hashTableSize - 1;
		StringBuffer buf = new StringBuffer();
		Iterator<T> iter = iterator();

		buf.append("[");
		for (int i = 0; i <= max; i++)
		{
			buf.append(iter.next());

	    	if (i < max)
				buf.append(", ");
		}
		buf.append("]");
		return buf.toString();
	}
	
	private class MyIterator implements Iterator<T> {
		
		Entry<T> next;
		int expectedModCount;
		int index;
		T lastReturned;
		
		//构造函数
		MyIterator() {
			int i = 0;
			Entry<T> n = null;
			expectedModCount = modCount;
			if(hashTableSize != 0) {
				while(i < table.length && ((n = table[i]) == null))
					i++;
			}
			next = n;
			index = i;
			lastReturned = null;
		}

		public boolean hasNext() {
			return next != null;
		}

		public T next() {
			if (modCount != expectedModCount)
				 throw new ConcurrentModificationException();

			Entry<T> entry = next;

			if (entry == null)
				 throw new NoSuchElementException();
			lastReturned = entry.value;
			Entry<T> n = entry.next;
			int i = index;
			if (n == null) {
				i++;
				while (i < table.length && ((n = table[i]) == null))
					i++;
			}
			index = i;
			next = n;
			return lastReturned;
		}

		public void remove() {
			 // check for a missing call to next() or previous()
			   if (lastReturned == null)
			      throw new IllegalStateException(
			         "Iterator call to next() " +
			         "required before calling remove()");
				if (modCount != expectedModCount)
					 throw new ConcurrentModificationException();

				// remove lastReturned by calling remove() in Hash.
				// this call will increment modCount
				Hash.this.remove(lastReturned);
				expectedModCount = modCount;
				lastReturned = null;
		}
		
	}
	
}
分享到:
评论

相关推荐

    自己实现的字符串hash类

    在编程领域,哈希表(Hash Table)是一种高效的数据结构,它通过计算字符串的哈希值来实现快速的查找、插入和删除操作。哈希表通常由数组和哈希函数组成,其中哈希函数将键(Key)映射到数组的特定位置。在这个场景...

    Android-java中的Geohash工具类

    Java中的Geohash工具类可以帮助开发者处理与地理位置相关的任务,提高效率并降低复杂性。本文将深入探讨Geohash的工作原理,如何在Java中实现以及在Android开发中的应用。 首先,我们来理解什么是Geohash。Geohash...

    Java实现GeoHash算法

    为了更好地理解并实现GeoHash算法,你可以参考`geoHash`压缩包中的源代码,它可能包含了实现GeoHash功能的类和方法。通过阅读和学习这些代码,你可以深入理解GeoHash的工作原理,并将其应用于自己的项目中。同时,...

    geohash算法实现Java代码

    Java代码实现GeoHash时,可以创建一个GeoHash类,包含 encode 和 decode 方法。encode方法用于生成GeoHash字符串,decode方法则用于还原经纬度坐标。此外,还可以扩展类来支持范围查询,例如计算两个GeoHash之间的...

    C#实现GeoHash类文件

    C#实现GeoHash算法,将空间二维数据转化成一维字符串,下载之后请自行修改命名空间

    一致性Hash简单实现

    - 编写`ConsistentHash`类,实现哈希环的逻辑,包括添加节点、删除节点、查找节点等方法。 - 实现查找算法,可以使用`TreeMap`的`lowerKey()`或`ceilingKey()`方法找到环上最近的虚拟节点。 4. **优化策略** - *...

    实现数字签名算法(DSA),Hash算法的实现C语言

    1)利用C\C++语言实现DSA算法。 2)DSA中的Hash函数采用SHA算法。 (1)消息填充:因为我们存储的时候是以字节为单位存储的,所以消息的长度(单位:位)一定是 8 的倍数。而我们填充的时候也一定是 8 位、8 位...

    常用的hash算法(java实现)

    在Java中,同样通过`MessageDigest`类实现SHA-1: ```java public class SHA1Example { public static String getSHA1(String input) { try { MessageDigest sha = MessageDigest.getInstance("SHA-1"); byte...

    Hash表模板类

    在"hash表模板类"这个压缩包中,你可能找到了一个实现了以上功能的C++源文件。通过阅读和理解代码,你可以学习到自定义哈希表的实现细节。此外,附带的测试代码和可运行文件可以帮助你验证该哈希表模板类的正确性,...

    图像的相似度Hash算法(aHash的delphi实现).rar

    在这个压缩包中,我们重点关注的是图像的相似度Hash算法,特别是平均哈希算法(aHash)的Delphi实现。 平均哈希算法(aHash)是一种简化版的图像哈希技术,用于快速比较两幅图像是否大致相同。其基本思想是先将图像...

    hash表实现举例 hash结构中带超时链表的实现

    1. hash key值计算,key的比较,内存分配,可以通过实现模板类重新定制 2. 实现按插入时间的先后,通过有序链表访问节点。用于按照时间先后,快速遍历(删除)超时节点。 3. hash 实现快速存取, 链表快速实现...

    VB 6 Hash类

    总之,`VB 6 Hash类`是VB 6中实现高效数据存储和查找的一种自定义数据结构,它的核心是哈希函数和冲突解决策略。掌握这个概念对于编写高效的VB 6程序非常有帮助,特别是在处理大量松散型数据时。

    Hash算法之SHA1实现c++

    SHA1(Secure Hash Algorithm 1)是一种广泛使用的散列函数,属于哈希算法的一种,它能够将任意长度的输入(也叫做预映射)通过一个单向函数转换为固定长度的输出,通常这个长度是160位。SHA1算法在网络安全、数据...

    自己实现的hash表

    在编程领域,哈希表(Hash Table)是一种高效的数据结构,它通过特定的哈希函数将数据映射到一个固定大小的数组中,以实现快速的查找、插入和删除操作。哈希表的关键在于设计良好的哈希函数,该函数能够尽可能均匀地...

    springboot+mybatis实现迭代慢hash验证登录.rar

    springboot+mybatis实现迭代慢hash验证登录,附带慢hash验证工具类,亲测可用!!!

    用于内存数据库的Hash索引的设计与实现

    内存数据库是一种特殊的数据库系统,它的...在设计和实现内存数据库的Hash索引时,需要综合考虑数据的特性、内存管理、持久化策略、并发控制以及冲突解决机制等多个方面,以实现高效、稳定且适应业务需求的数据库系统。

    hashin失效vumat_hashin破坏准则_vumatfailure_vumathashin失效_hashin_vumat

    在“hashinʧ Чvumat.txt”这个文件中,很可能是详细介绍了如何在VUMAT子程序中实现Hashin失效准则的具体步骤和技术细节,可能包括以下几个方面: 1. **材料参数的定义**:首先需要确定材料的各种参数,如纤维和...

    如何找到周围8个区域的GeoHash编码

    - 在Java中,可以使用`Geohash`类或者第三方库(如`geohash-java`)来生成GeoHash编码。 - 实现时,需要处理经纬度值的范围转换(-180至180度经度,-90至90度纬度)和精度设置。 - 使用递归或循环结构来执行Geo...

    murmurhash-java:murmurhash2的32位和64位实现

    如果您想了解最新的杂音世界,请查看Guava的类,该类具有murmur3和32位的实现。建造用maven构建一个包: mvn package运行测试: mvn test公开API public final class MurmurHash { public static int hash32 ( ...

    hash表delphi实现源代码(免积分下载)

    在"Hashtable[1].pas.txt"源代码中,这些概念可能以类的形式实现,包括构造函数、析构函数、各种方法(如Insert、Find、Delete)以及可能的属性(如Count、Capacity等)。通过阅读源代码,我们可以深入了解Delphi中...

Global site tag (gtag.js) - Google Analytics