/** * 哈希算法 * @author Administrator * */ public class HashTableDemo2 {
public static void main(String[] args) { HashTab hashTable = new HashTab(3); Scanner scanner = new Scanner(System.in); String key = ""; while(true) { System.out.println("add:增加用户"); System.out.println("list:显示用户"); System.out.println("find:根据id查找用户"); System.out.println("update:修改用户"); System.out.println("del:删除用户"); System.out.println("exit:退出用户"); key = scanner.next(); switch (key) { case "add": System.out.println("请输入id"); int id = scanner.nextInt(); System.out.println("请输入姓名"); String name = scanner.next(); User user = new User(id,name); hashTable.add(user); break; case "list": hashTable.showList(); break; case "find": System.out.println("请输入id"); id = scanner.nextInt(); hashTable.getById(id); break; case "update": System.out.println("请输入id"); id = scanner.nextInt(); System.out.println("请输入需要修改姓名"); name = scanner.next(); user = new User(id,name); hashTable.updateUser(user); break; case "del": System.out.println("请输入id"); id = scanner.nextInt(); hashTable.del(id); break; case "exit": scanner.close(); System.exit(0); break; } } }
}
/** * 创建一个hashTable */ class HashTab{ private LinkedListDemo[] lLinkedListDemo = null; private int size;//一共有多少个链表 /** * 创建构造器 * @param size */ public HashTab(int size) { this.size = size; lLinkedListDemo = new LinkedListDemo[size]; for (int i = 0; i < size; i++) { lLinkedListDemo[i] = new LinkedListDemo(); } }
/** * 添加用户 */ public void add(User user) { //获取散列值来确定放在哪个链表上 int hasNum = hasFun(user.getId()); lLinkedListDemo[hasNum].add(user); }
/** * 遍历用户 */ public void showList() { for (int i = 0; i < size; i++) { lLinkedListDemo[i].showList(i); } }
/** * 根据id查找用户 */ public void getById(int id) { //获取散列值来确认去哪个链表上获取用户 int hasNum = hasFun(id); User user = lLinkedListDemo[hasNum].getById(id); if(user == null) { System.out.println("查找的用户不存在!"); }else { System.out.println(user.toString()); } }
/** * 修改用户 */ public void updateUser(User user) { //获取散列值 int hasNum = hasFun(user.getId()); lLinkedListDemo[hasNum].update(user); }
/** * 删除用户 * @param id */ public void del(int id) { //获取散列值 int hasNum = hasFun(id); lLinkedListDemo[hasNum].delete(id); }
/** * 编写散列函数来获取散列值 * @param id * @return */ private int hasFun(Integer id) {
return id % size; }
}
/** * 创建链表信息 * @author Administrator * */ class LinkedListDemo{ private User head;//链表的头结点
/** * 创建用户信息 * @author Administrator * */ class User{ private Integer id; private String name; private User next; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public User getNext() { return next; } public void setNext(User next) { this.next = next; } public User(Integer id, String name) { this.id = id; this.name = name; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", next=" + next + "]"; }
}
第二种方法可以完成对有序数据的新增:
package com.yu.hash;
import java.util.Scanner;
/** * 哈希算法的操作 * @author Administrator * */ public class HashTableDemo3 {
public static void main(String[] args) { HashTab1 hashTable = new HashTab1(3); Scanner scanner = new Scanner(System.in); String key = ""; while(true) { System.out.println("add:增加用户"); System.out.println("ll:显示用户"); System.out.println("find:根据id查找用户"); System.out.println("update:修改用户"); System.out.println("del:删除用户"); System.out.println("exit:退出用户"); key = scanner.next(); switch (key) { case "add": System.out.println("请输入id"); int id = scanner.nextInt(); System.out.println("请输入姓名"); String name = scanner.next(); User1 user = new User1(id,name); hashTable.add(user); break; case "ll": hashTable.showList(); break; case "find": System.out.println("请输入id"); id = scanner.nextInt(); hashTable.findById(id); break; case "update": System.out.println("请输入id"); id = scanner.nextInt(); System.out.println("请输入需要修改姓名"); name = scanner.next(); user = new User1(id,name); hashTable.update(user); break; case "del": System.out.println("请输入id"); id = scanner.nextInt(); hashTable.del(id); break; case "exit": scanner.close(); System.exit(0); break; } } } }
/** * 创建hashTable */ class HashTab1{ //创建一个链表的数据 private LinkedListDemo1[] linkedArray = null; int size = 0;
/** * 创建构造方法 * @param size */ public HashTab1(int size) { this.size = size; linkedArray = new LinkedListDemo1[size]; for (int i = 0; i < size; i++) { linkedArray[i] = new LinkedListDemo1(); } }
/** * 新增数据 */ public void add(User1 user) { //得到散列值,这样确认散列到那个链表上面 int hasNum = hasFun(user.getId()); linkedArray[hasNum].add(user); }
/** * 修改数据 * @param id * @return */ public void update(User1 user) { //得到散列值,这样确认散列到那个链表上面 int hasNum = hasFun(user.getId()); linkedArray[hasNum].update(user); }
/** * 遍历元素 * @param id * @return */ public void showList() { for (int i = 0; i < size; i++) { linkedArray[i].showList(i); } }
/** * 根据id查找元素 * @param id * @return */
public void findById(int id) { int hasNum = hasFun(id); User1 user = linkedArray[hasNum].findById(id); if(user == null) { System.out.println("用户数据不存在"); }else { System.out.println("用户:" + user.toString()); } }
/** * 删除元素 * @param id * @return */ public void del(int id) { int hasNum = hasFun(id); linkedArray[hasNum].del(id); }
private int hasFun(Integer id) {
return id % size; } }
/** * 定义链表信息 */ class LinkedListDemo1{ //定义单个节点的值 private User1 head = new User1(0,"");