2018-06-06哈希表

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;
}
   
}

你可能感兴趣的:(2018-06-06哈希表)