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}条链表的数据为\t")
        if (head == null) {
            println("链表为空")
            return
        }
        // 定义一个辅助的指针
        var cur = head
        breakable {
            while (true) {
                if (cur == null) {
                    break()
                }
                printf("=>id=%d,name=%s\t", 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线上\n", empLinkedListNo)
        println("查找结果展示开始:")
        val emp = empLinkedListArr(empLinkedListNo).findEmpById(id)
        if (emp != null) {
            printf("=>id=%d,name=%s\n", emp.id, emp.name)
        } else {
            printf("没找到id=%d的雇员信息\n", id)
        }
        println("查找结果展示结束")
    }

}

 

posted @ 2020-02-24 09:08  cerofang  阅读(140)  评论(0编辑  收藏  举报