怎样简简单单的用java手写个哈希表

什么是哈希表

哈希表就是一个数组加一个链表
数组的的每一个位置对应一个链表
通过取余的方式来确定一个数据往第几个链表里面放

简简单单写一个数据类

package Hashtable;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;



public class Emp {
    
    
    private int id;
    private String name;
    private Emp next;

    public Emp(int id, String name) {
    
    
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
    
    
        return "Emp{" +
                "id=" + id +
                ", name='" + name +'}';
    }

    public int getId() {
    
    
        return id;
    }

    public void setId(int id) {
    
    
        this.id = id;
    }

    public String getName() {
    
    
        return name;
    }

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

    public Emp getNext() {
    
    
        return next;
    }

    public void setNext(Emp next) {
    
    
        this.next = next;
    }
}

简简单单写个链表

package Hashtable;

import lombok.Data;


public class EmpLinkedList {
    
    
   private Emp head;
   private Emp end;
   
   public void add(Emp emp){
    
    
      if(head == null){
    
    
         head=emp;
         end=emp;
      }else{
    
    
         end.setNext(emp);
         end=emp;
      }

   }

   public void deleteEmpById(int id){
    
    
      Emp ep=head;
      if(head==null){
    
    
         System.out.println("链表为空");

      }else{
    
    
		//删除节点的时候我们要获取要删除节点的前一个节点 
		//然后把这前一个节点的next指向删除节点的后一个节点 这样就删除了
		//这里处理的是首节点
         if(ep.getId()==id){
    
    
            if(ep.getNext()==null){
    
    
               head=null;
            }else{
    
    
               Emp nep= ep.getNext();
               ep.setNext(nep.getNext());
            }

         }else{
    
    
		//这里处理的是非首节点
            while(ep!=null) {
    
    
               if (ep.getNext().getId() == id) {
    
    
                  Emp nep= ep.getNext();
                  ep.setNext(nep.getNext());
                  break;
               } else {
    
    
                  ep = ep.getNext();
               }

            }

         }

         }




   }

   //遍历打印
   public Emp getEmpById(int id){
    
    
      Emp ep=head;
      if(head==null){
    
    
         System.out.println("链表为空");
         return null;
      }else{
    
    
         while(ep!=null) {
    
    

            if (ep.getId() == id) {
    
    
               return ep;
            } else {
    
    
               ep = ep.getNext();
            }
         }
      }
      return null;
   }

   public void toStringEmp(){
    
    
       Emp ep=head;
      if(ep==null){
    
    
         System.out.println("该emp链表为空");
        
      }else{
    
    
         while(ep!=null){
    
    
            System.out.println(ep.toString());
            if(ep.getNext()==null){
    
    

               break;
            }else{
    
    
               ep=ep.getNext();
            }

         }
      }

   }



   public Emp getHead() {
    
    
      return head;
   }

   public void setHead(Emp head) {
    
    
      this.head = head;
   }

   public Emp getEnd() {
    
    
      return end;
   }

   public void setEnd(Emp end) {
    
    
      this.end = end;
   }
}

简简单单把链表放数组里面

package Hashtable;

public class myHashTable {
    
    
    private EmpLinkedList[] empLinkedLists;
    private int size ;
    public myHashTable(int size) {
    
    
        this.size = size;
        this.empLinkedLists=new EmpLinkedList[size];
        for (int i=0;i<size;i++){
    
    
            empLinkedLists[i]=new EmpLinkedList();
        }
    }
    public void add(Emp emp){
    
    
        int hash = gethash(emp.getId());


        empLinkedLists[hash].add(emp);
    }

    public void toStringAllEmp(){
    
    
        for(int i=0;i<size;i++){
    
    
             empLinkedLists[i].toStringEmp();
        }
    }

    public void deleteEmpById(int id){
    
    
        int hash = gethash(id);
       empLinkedLists[hash].deleteEmpById(id);
    }

    public Emp getEmpById(int id){
    
    
        int hash = gethash(id);
        Emp empById = empLinkedLists[hash].getEmpById(id);
        return empById;

    }
		//这里就是简单的哈希运算
    public int gethash(int i){
    
    
        return i%size;
    }

}

简简单单的测试

package Hashtable;

import org.junit.Test;

public class test {
    
    
    @Test
    public void test(){
    
    
        myHashTable myHashTable = new myHashTable(2);
        myHashTable.add(new Emp(1,"tom"));
        myHashTable.add(new Emp(2,"cat"));
        myHashTable.add(new Emp(3,"jack"));
        myHashTable.add(new Emp(3,"jack"));
       myHashTable.toStringAllEmp();
        System.out.println("==========");
        myHashTable.deleteEmpById(3);
        myHashTable.toStringAllEmp();

//        Emp empById = myHashTable.getEmpById(1);
//        String s = empById.toString();
//        System.out.println(s);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_47431361/article/details/123775843
今日推荐