2020年2月24日09:06:11,Hash散列
Posted cerofang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020年2月24日09:06:11,Hash散列相关的知识,希望对你有一定的参考价值。
- 问题描述
/*
* 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址..),当输入该员工的id时,
* 要求查找到该员工的所有信息.
* ?要求: 1)不使用数据库,,速度越快越好=>哈希表(散列)
* 2)添加时,保证按照id从低到高插入[课后思考:如果id不是从低到高插入,但要求各条链表仍是从低到高,怎么解决?]
* 3)使用链表来实现哈希表, 该链表不带表头
*
* */
- 代码实现
package day0223 /* * 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址..),当输入该员工的id时, * 要求查找到该员工的所有信息. * ?要求: 1)不使用数据库,,速度越快越好=>哈希表(散列) * 2)添加时,保证按照id从低到高插入[课后思考:如果id不是从低到高插入,但要求各条链表仍是从低到高,怎么解决?] * 3)使用链表来实现哈希表, 该链表不带表头 * * */ import scala.io.StdIn import util.control.Breaks._ object HashTabDemo { def main(args: Array[String]): Unit = { // 创建一个hashTab val hashTab = new HashTab(7) // 创建一个菜单 var key = "" while (true) { println("add:list:find") key = StdIn.readLine() key match { case "add" => { println("请输入ID") val id = StdIn.readInt() println("请输入Name") val name = StdIn.readLine() val emp = new Emp(id, name) hashTab.add(emp) } case "list" => { hashTab.list() } case "find" => { println("请输入ID") val id = StdIn.readInt() hashTab.findEmpById(id) } } } } } // 创建emp类 class Emp(eId: Int, eName: String) { val id = eId var name = eName var next: Emp = null } // 创建empLinedList class EmpLinkedList { // 定义头指针,直接指向一个雇员 var head: Emp = null // 添加雇员,雇员的id总是从小到大的排列,都是递增的(找到链表的最后加入即可) def add(emp: Emp): Unit = { if (head == null) { head = emp return } // 定义辅助指针 var cur = head breakable { while (true) { if (cur.next == null) { break() } cur = cur.next } } cur.next = emp } def list(i: Int): Unit = { print(s"第${i}条链表的数据为 ") if (head == null) { println("链表为空") return } // 定义一个辅助的指针 var cur = head breakable { while (true) { if (cur == null) { break() } printf("=>id=%d,name=%s ", cur.id, cur.name) cur = cur.next } } println() } def findEmpById(id: Int): Emp = { // 遍历查找 if (head == null) { println("链表为空") return null } var cur = head breakable { while (true) { if (cur == null) { break() } if (cur.id == id) { break() } cur = cur.next } } return cur } } class HashTab(val size: Int) { val empLinkedListArr: Array[EmpLinkedList] = new Array[EmpLinkedList](size) // 初始化empLinkedListArr中的各个元素 for (i <- 0 until size) { empLinkedListArr(i) = new EmpLinkedList } def add(emp: Emp): Unit = { // 返回该员工应该加入的那条链 val empLinkedListNo = hashFun(emp.id) empLinkedListArr(empLinkedListNo).add(emp) } def hashFun(id: Int): Int = { id % size } // 遍历整个hash表 def list(): Unit = { println("遍历结果展示开始:") for (i <- 0 until size) { empLinkedListArr(i).list(i) } println("遍历结果展示结束") } def findEmpById(id: Int): Unit = { val empLinkedListNo = hashFun(id) printf("查找元素散列在第%d线上 ", empLinkedListNo) println("查找结果展示开始:") val emp = empLinkedListArr(empLinkedListNo).findEmpById(id) if (emp != null) { printf("=>id=%d,name=%s ", emp.id, emp.name) } else { printf("没找到id=%d的雇员信息 ", id) } println("查找结果展示结束") } }
以上是关于2020年2月24日09:06:11,Hash散列的主要内容,如果未能解决你的问题,请参考以下文章
快速阅读实践总结第一期:2017年9月11日——2017年9月24日