import java.math.BigInteger;
public class Hashmap {
private Person[] arr;
public Hashmap(int maxnum){
arr=new Person[maxnum];
}
public void insert(Person p){
int key=hashCode(p.getAge());
while(arr[key]!=null&&arr[key].getName()!=null){
++key;
key%=arr.length; //比如第一个是99,第二个是599那么599的位置已经被99占领了,模了之后越界了
} //,所以要对100余数
arr[key]=p;
}
/*查找数据要注意:99插入后,再插入199,
* 但是此时199插入在哪个位置是不知道的,
* 因为他们的hashcode是一样的。
* 那么,我们就要从第一个99的位置开始往下找,判断索引所对应的值是否相等
* (为什么要往下找呢?)
* 因为我们插入的时候就是++key,
* 所以从第一个99开始往后的索引都是那些hashcode相同但是name不一样的值
* */
public Person find(String age){
int key=hashCode(age);
while(arr[key]!=null){
if(arr[key].getAge().equals(age)){
return arr[key];
}
++key;
key%=arr.length;
}
return null;
}
public Person delete(String age){
int key=hashCode(age);
while(arr[key]!=null){
if(arr[key].getAge().equals(age)){
Person temp=arr[key]; //同样寻找key值与我们所要寻找的值相同的值
temp.setName(null); //把它的name设置为空,就是把它删除了,
// 但是它的key索引还是存在的(这也就是为什么插入操作的时候要判断两个不为空)
return temp;
}
++key;
key%=arr.length;
}
return null;
}
public int hashCode(String age){
BigInteger hashVal=new BigInteger("0");
BigInteger pow27=new BigInteger("1");
for(int i=age.length()-1;i>=0;i--){
int letter=age.charAt(i)-96;
BigInteger letterB=new BigInteger(String.valueOf(letter));
hashVal=hashVal.add(letterB.multiply(pow27));
pow27=pow27.multiply(new BigInteger(String.valueOf(27)));
}
return hashVal.mod(new BigInteger(String.valueOf(arr.length))).intValue();
}
}
public class TestHash {
public static void main(String[] args) {
Hashmap h=new Hashmap(4);
Person p2=new Person("a","李四");
Person p1=new Person("ct","王五");
Person p3=new Person("b","张三");
h.insert(p1);
h.insert(p2);
h.insert(p3);
h.delete("b");
System.out.println(h.find("a").getName());
System.out.println(h.find("ct").getName());
System.out.println(h.find("b").getName());
}
}
public class Person {
private String name;
private String age;
public Person(String age,String name){
this.name=name;
this.age=age;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the age
*/
public String getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(String age) {
this.age = age;
}
}