初识“哈希”

今天刚刚写了一下有关哈希链表的代码:感觉还是挺简单的,虽然我的是没啥技术含量的因为我没有解决哈希表冲突的问题,不过以后会解决的,解决的方法就是“挂链”。


其实我是不能说很了解hash的,我只是把它当做数组与链表的结合,数组为主,链表在数组上,我按我的理解把它实现出来,它的形式就是一个一定长度的数组加上n条链表。

首先我先简单介绍一下我所知道哈希链表:

哈希表是基于数组的,用于存储大批量的数据;如果说数组是查找数据的能手,链表是
增删数据的能手,那么哈希表便是奉行的我们中国的“中庸之道”。他可以说是数组与链表的结合。

如果你不追求完美的话,只想着体验一下哈希表,那么建立一个哈希表其实很简单:你只需要一个节点类和一个方法类就可以。
一下是节点类:
public class Student {
//声明学生的属性
private String name ;
private int namber ;
private Student stuNext ;
/**
* 构造方法
* @param name
*/
public Student(String name,int namber){
this.name = name ;
this.namber = namber ;
}


public void setName(String name){
this.name = name ;


}
public String getName(){
return name ;
}


public void setNamber(int namber){
this.namber = namber;


}
public int getNumber(){
return namber ;
}

public void setStu(Student stuNext){
this.stuNext = stuNext ;
}
public Student getStu(){
return stuNext;
}

}

其实方法类也就是包括最基本的增删改查的类,理想情况下 ,用递归方法比较好,但是由于我当时没有想到如何用递归方法所以我采用的是其他方法。
这里我只展示其中一部分代码(增,查)

其中方法可以根据个人的想法来写并没有固定模式,这里我用的是取余法。
/**
* 添加student的方法
*/
public void add(Student stu) {
int key = stu.getNumber();
int index = key % 7;

if (hashline[index] == null) {

hashline[index] = stu;
//System.out.println("hashline[index]=" + hashline[index].getName());

} else if (hashline[index] != null) {

Student stu1 = this.getFinal(hashline[index]);
System.out.println("stu111"+stu1);
stu1.setStu(stu);
System.out.println("stu1=" + stu1.getStu().getName());

}
//
}



/**
* 查找的方法
*/
public Student find(int key) {
int index = key % 7;
if(hashline[index]==null){
System.out.println("没有此人!");
return null;
}
Student stu = hashline[index];
int i = 0;
if (this.getlenght(stu) == 0) {
System.out.println("没有此人");
return null;
}
while (i != this.getlenght(stu)) {
if (stu == null) {
System.out.println("没有此人");
return null;
} else if (stu != null) {
if (stu.getNumber() == key) {
return stu;
} else {
stu = hashline[index];
}
}
i++;
System.out.println("i=" + i);
}

return null;
}

特别提示:用递归方法比较好,这个方法一不注意就有可能报空。里面有一些嵌套的方法没有给出。

测试:
public static void main(String[] args) {
HashLine hf = new HashLine();
//
Student stu1 = new Student("张三", 01);
Student stu2 = new Student("里斯", 02);
Student stu13 = new Student("王五", 05);
Student stu3 = new Student("liuzi", 8);
Student stu4 = new Student("起", 9);
Student stu5 = new Student("吧", 11);
Student stu6 = new Student("就", 15);

hf.add(stu13);
hf.add(stu2);
hf.add(stu1);
hf.add(stu3);
hf.add(stu6);
hf.add(stu4);
hf.add(stu5);
System.out.println("找到此人 " + hf.find(01).getName());
hf.find(13);

}

输出结果为:找到此人张三
没有此人
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值