• 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("查找结果展示结束")
        }
    
    }
    
  • 相关阅读:
    Linux下的crontab定时执行任务命令详解
    TP5使用Composer安装PhpSpreadsheet类库实现导入导出
    在本地创建分支并发布到远程仓库
    Linux中文件的可读,可写,可执行权限的解读以及chmod,chown,chgrp命令的用法
    crontab 定时写法整理
    Linux && Windows下基于ThinkPHP5框架实现定时任务(TP5定时任务)-结合Crontab任务
    Echarts环形图、折线图通过ajax动态获取数据
    javascript另类方法高效实现htmlencode()与htmldecode()函数,附带PHP请求完整操作
    PHP获取本月开始、结束时间,近七天所有时间
    关于sql中case when用法
  • 原文地址:https://www.cnblogs.com/cerofang/p/12355551.html
Copyright © 2020-2023  润新知