/*
* 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(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("查找结果展示结束")
}
}