zoukankan      html  css  js  c++  java
  • 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("查找结果展示结束")
        }
    
    }
    
  • 相关阅读:
    毕业设计第一周第一天
    python添加水印
    python 连接MySQL数据库
    利用Python爬取免费代理IP
    Python将大的csv文件拆分多个小的csv文件
    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream
    org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://localhost:9000/usr/local/spark/zytdemo
    Error: Could not open client transport with JDBC Uri: jdbc:hive2://localhost:10000: java.net.ConnectException: 拒绝连接 (Connection refused) (state=08S01,code=0)
    大数据常用命令
    硬件工程师必会电路模块之MOS管应用(转)
  • 原文地址:https://www.cnblogs.com/cerofang/p/12355551.html
Copyright © 2011-2022 走看看