哈希表--Java实现

版权声明:071623 https://blog.csdn.net/weixin_43584220/article/details/88804066
package cn.BST.Ravanla;
/**
 * 
 * @author Ravanla
 * 我们只要看哈希表(HashTable)里的各种方法就可以知道哈希表需要什么样的类,类里又需要有什么方法
 * 
 * 1.我们需要学生信息类
 *  1.在这个类里需要两个属性field,年龄和信息
 *	2.还有构造方法(给这两个属性赋值的方法)

public class TestHashTable {
	public static void main(String[] args) {
		StuInfo h1 = new StuInfo("20001", 14);
		StuInfo h2 = new StuInfo("20002", 15);
		StuInfo h3 = new StuInfo("20003", 16);
		StuInfo h4 = new StuInfo("20004", 17);
		StuInfo h5 = new StuInfo("20005", 18);

2.还需要哈希表类(HashTable)

 *
 *  1.需要put方法
 *  2.从方法中可以看出这个方法是用转载StuInfo对象的数组,
 *    这个数组的长度可以是用Arrays包里的可变长度数组class,也可以自己手动输入数组长度(我就是手动输入的)

		HashTable ht = new HashTable();
		ht.put(h1);
		ht.put(h2);
		ht.put(h3);
		ht.put(h4);
		ht.put(h5);

3.在System.out.println中可以看出这个类里还有get方法

 *  
 *    形参类型也可以看出,多次调用一个方法里的不同对象可以看出类里有转载对象的容器(数组)
 *    但是问题在于这个console的结果,结果表明HashTable类中的数组不是按下标顺序存储的
 *    而是按照学生信息的年龄存储到相应下标的
 *    所以这个get方法取出与这个对象的年龄相应的下标里的值,这个值还很特殊
 * (但从这看不出,要去HashTable类里看)
 *    放回类型是StuInfo对象,所以StuInfo中需要toString方法,使打印这个对象时不是打印它的地址值
 * ,而是打印对象里的属性值
 *    get方法该完了我们的put方法也需要该,因为按照年龄取就要按照年龄存,这个思想就是哈希的浅内容,
 *    精华在于你是想怎么存完全取决于你,使你数组的存储空间高效利用

		System.out.println(ht.get(h4));
		System.out.println(ht.get(h1));
		System.out.println(ht.get(h3));
		System.out.println(ht.getData(4));
		System.out.println(ht.getData(1));
		System.out.println(ht.getData(3));
		System.out.println(ht.getData(17));
		System.out.println(ht.getData(14));
		System.out.println(ht.getData(16));
	}
}

结果

StuInfo [age=17, count=20004]
StuInfo [age=14, count=20001]
StuInfo [age=16, count=20003]
null
null
null
StuInfo [age=17, count=20004]
StuInfo [age=14, count=20001]
StuInfo [age=16, count=20003]

哈希表(HashTable)类

package cn.BST.Ravanla;

public class HashTable {
	private StuInfo[] data = new StuInfo[100];
	
	public void put(StuInfo stuInfo) {
		int index = stuInfo.hashCode(stuInfo);
		data[index] = stuInfo;
	}
	public StuInfo getData(int index) {
		return data[index];
	}
	public void setData(StuInfo[] data) {
		this.data = data;
	}
	public StuInfo get(StuInfo stuInfo) {
		return data[stuInfo.hashCode(stuInfo)];
	}
//	public StuInfo get(StuInfo stuInfo) {
//		return stuInfo;
//	}
}


学生信息(StuInfo)类

package cn.BST.Ravanla;
/**
 * 
 * @author Ravanla
 * 学生信息
 *
 */
public class StuInfo {
	private int age;
	private String count;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getCount() {
		return count;
	}
	public void setCount(String count) {
		this.count = count;
	}
	@Override
	public String toString() {
		return "StuInfo [age=" + age + ", count=" + count + "]";
	}
	
	//哈希表
	public int hashCode(StuInfo stuinfo) {
		return stuinfo.age;
	}
	public StuInfo(String count, int age) {
		super();
		this.age = age;
		this.count = count;
	}
	
}


最后,这些构造方法,年龄学号等属性的封装,还有toString方法都可以通过右键->source->Generate …
快捷创造(Alt + Shift + s)

猜你喜欢

转载自blog.csdn.net/weixin_43584220/article/details/88804066