zoukankan      html  css  js  c++  java
  • java HastTable实现

    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;

     }

    }

  • 相关阅读:
    运算
    使用mysql出现错误:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column '??????' in 'field list'
    POI-HSSF and POI-XSSF
    java pio项目使用
    mysql安装及卸载
    pdf转word
    【android studio】android studio使用过程中,搜集的一些问题
    github提交失败并报错java.io.IOException: Authentication failed:
    收集的github的东西
    Material Design
  • 原文地址:https://www.cnblogs.com/wwwfj/p/3368220.html
Copyright © 2011-2022 走看看