篮子放鸡蛋-Scala实现自定义哈希散列

2021-05-06  本文已影响0人  量U移动广告归因
package com.datacrafts.datadvs.link

import scala.io.StdIn


/**
 * 存储数据的链表节点
 *
 * @param id
 * @param name
 */
class linkNode(val id:Int,val name:String){
    var next:linkNode = null
}

/**
 * 存储数据的链表
 */
class link{
    var head:linkNode = null
    var size:Int = 0

  /**
   * 添加链表节点
   * @param newNode
   */
    def add(newNode:linkNode): Unit ={
      var curr = head
      if(curr == null){
        head = newNode
      } else {
        while (curr.next != null) {
          curr = curr.next
        }
        curr.next = newNode
      }
      size += 1
    }

  /**
   * 遍历存储数据的链表
   */
    def list(): Unit = {
      var curr = head
      while (curr != null){
        printf("=>id=%d name=%s ",curr.id,curr.name)
        curr = curr.next
      }
      println()
    }

    /**
     * 根据ID查找节点
     * @param id
     */
    def findById(id:Int): linkNode = {
        var curr = head
        while (curr != null){
          if(curr.id == id){
            return curr
          }
          curr = curr.next
        }
        null
    }
}


/**
 * 自定义hashmap散列结构
 * 数据存储采用链表存储
 */
class hashMap(val size:Int) {
  val linkArr:Array[link] = new Array[link](size)
  for(index <- 0 until linkArr.length){
    linkArr(index) = new link()
  }

  /**
   * 往hashmap添加数据
   * @param id
   * @param name
   */
  def add(id:Int,name:String): Unit ={
    val hash = id % 5
    val node = new linkNode(id,name)
    linkArr(hash).add(node)
  }

  /**
   * 遍历整个hashmap
   */
  def list(): Unit ={
    for(i <- 0 until linkArr.length){
      linkArr(i).list()
    }
  }

  def findById(id:Int): linkNode ={
    val hash = id % 5
    val node = linkArr(hash).findById(id)
    node
  }
}


object hashMap{
  def main(args: Array[String]): Unit = {
    val hm = new hashMap(5)

    var key = ""
    while(true){
      println("add:添加成员")
      println("list:显示成员")
      println("其他:退出")
      key = StdIn.readLine()
      key match {
        case "add"=>{
          println("请输入ID")
          var id = StdIn.readInt()
          println("请输入姓名")
          var name = StdIn.readLine()
          hm.add(id,name)
        }
        case "list"=>{
          hm.list()
        }
        case _=>{
          sys.exit()
        }
      }
    }
  }
}
上一篇 下一篇

猜你喜欢

热点阅读