用java实现一个哈希表类

public class HashTable{

   private String[] name;    //关键字

   private int sum;    //容量

  

   public static void main(String[] args){    //测试

        HashTable ht = new HashTable();

        ht.add("chenhaitao");

        ht.add("zhongcheng");

        ht.add("baiyudong");

        ht.add("huangshiyao");

        ht.add("djflkd");

        ht.add("gg");

        System.out.println(ht.contains("baiyudong"));

        ht.remove("huangshiyao");

        System.out.println(ht.contains("huangshiyao"));

        ht.print();

   }

 

  public HashTable(){             //初始化,初始容量是10个

      name = new String[10];

      sum = 0;

  }


  public int hash1(String s){                                       //哈希函数

        return Math.abs(s.hashCode())%name.length;

  }


  public int hash2(String s){                                     //处理冲突的哈希函数

      int result = Math.abs(s.hashCode())%(name.length-1);

      System.out.println(s+"--"+result);

      if(result%2==0){

          return result + 1;

      }

   return result;

  }

 

  public boolean contains(String s){                  //哈希表里面是否包含字符串s

      int start = hash1(s);

      int i = start;

      while (name[i] != null){

           if(name[i].equals(s)){

               return true;

           }

        i = (i + hash2(s))%name.length;

        if(i == start){

             return false;

        }

      }

   return false;

  }


  public void add(String s){

       if(sum>=name.length/2){

            this.rehash();

       }

      int start = hash1(s);

      int i = start;

     while(name[i] != null){

         if(s.equals(name[i])){

              return;

         }

       i = (i + hash2(s))%name.length;

      if(i == start){

          return;

       }

     }

    name[i] = s;

    sum ++;

  }


   public void rehash(){                              //扩建一个哈希表为原表的两倍,把原来的哈希表添加到新表中

       HashTable ht = new HashTable();

       ht.name = new String[this.name.length * 2];

       for(int i = 0; i < this.name.length; i ++){

               if((this.name[i] != null)){

                   ht.add(this.name[i]);

              }

       }

     this.name = ht.name;

     this.sum = ht.sum;

   }

   

  public void remove(String s){                     //删除某个元素

         if(this.contains(s)){

              int i = this.getValue(s);

              this.name[i] = null;

         }

  }

 

  public int getValue(String s){                //得到s在哈希表中的位置

    int start = this.hash1(s);

    int i = start;

    while(this.name[i] != null){

       if(this.name[i].equals(s)){

           return i;

       }

     i = (i + this.hash2(s))%this.name.length;

    if(i == start){

      return -1;

     }

   }

  return -1;

  }


  public void print(){                       //输出哈希表中所有元素

     for(int i = 0; i < name.length; i ++){

        System.out.println(i+":"+name[i]);

    }

  }


public int size(){          //哈希表存储元素的个数

   return this.sum;

 }

public int length(){            //哈希表的长度

    return this.name.length;

 }

}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值