scala基础篇·Map

scala基础篇·Map

代码:

package base

import scala.collection.mutable

object TestMap {

  def main(args: Array[String]): Unit = {
    testBasic
    testTraverse
    testFunctions
    test
  }


  /**
    * 测试基础
    */
  def testBasic(): Unit = {
    println("---- testBasic  start ----")
    println("\n----define start----")
    //定义map
    //不可变map
    val map1 = Map("id" -> 1, "name" -> "Alice", "age" -> 22)
    println("map1:  " + map1)
    //可变map
    val map2 = scala.collection.mutable.Map("id" -> 1, "name" -> "Alice", "age" -> 22)
    println("map2:  " + map2)
    //可变指定类型map
    val map3 = new mutable.HashMap[String, Any]()
    println("map3:  " + map3)
    println("----define end----")

    //get value
    println("\n----getValue start----")
    println("map1:get(id)    =>   " + map1("id"))
    println("map2:get(name)    =>   " + map2("name"))
    println("map3:get(name)    =>   " + (if (map3.contains("name")) map3("name") else "null"))
    println("map3:getOrElse(name)    =>   " + map3.getOrElse("name", "null"))
    println("----getValue end----")

    //update value
    println("\n----updateValue start----")
    //map1("name") = "Bob" 不可变,因此不能更新,但是可以基于map1生成新的
    val map4 = map1 + ("name" -> "Neo", "grade" -> "12")
    println("map1:update(name)&add(grade) to map4   =>   " + map4)

    map2("name") = "Bob"
    println("map2:update(name)    =>   " + map2)
    println("----updateValue end----")

    //add value
    println("\n----addValue start----")
    //map1 += ("score" -> 95) 不可变,因此不能新增,但是可以基于不可变的map1生成map4,且二者共享map1的结构
    val map5 = map1 + ("score" -> 99)
    println("map1:add(score,grade) to map5   =>   " + map5)
    map2 += ("score" -> 95, "grade" -> "10")
    println("map2:add(score,grade)   =>   " + map2)
    println("----addValue end----")

    //remove value
    println("\n----removeValue start----")
    map2 -= "score"

    println("map2:remove(score)   =>   " + map2)
    println("----removeValue end----")

    println("---- testBasic  end ----")
  }

  /**
    * 测试遍历
    */
  def testTraverse(): Unit = {
    println("---- testTraverse  start ----")
    val map1 = Map("Alice" -> 10, "Bob" -> 12, "Candy" -> 15, "David" -> 18)

    print("遍历map1的key-value:  ")
    for ((k, v) <- map1) {
      printf("(%s,'%d')", k, v)
    }
    println()

    print("基于map1生成map2:  ")
    val map2 = for ((k, v) <- map1) yield (v * v, k)
    println(map2)


    print("遍历map1的key:  ")
    for (k <- map1.keys)
      printf("%s  ", k)
    println()

    print("遍历map1的value:  ")
    for (v <- map1.values)
      printf("%d  ", v)
    println()

    println("map1.keySet  =>  " + map1.keySet)

    println("---- testTraverse  end ----")
  }

  /**
    * 测试方法
    */
  def testFunctions(): Unit = {
    val map = Map("alice" -> 98, "Bob" -> 86, "Candy" -> 90, "david" -> 82, "Ellen" -> 78, "Harry" -> 78)

    println("---- filter start ----")
    println("filter  =>  " + map.filter(e => {
      e._2 > 90
    }))
    println("filterNot  =>  " + map.filterNot(e => {
      e._2 > 90
    }))
    println("filter  =>  " + map.filter(e => {
      Character.isLowerCase(e._1.charAt(0))
    }))
    println("filterKeys  =>  " + map.filterKeys(k => {
      Character.isLowerCase(k.charAt(0))
    }))
    println("---- filter end ----")
    println()
    println("---- find start ----")
    println("find(找到一个就返回)  =>  " + map.find(e => {
      Character.isLowerCase(e._1.charAt(0))
    }))
    println("---- find end ----")
    println()

    println("---- maxBy/minBy start ----")
    println("maxBy:key  =>  " + map.maxBy(_._1))
    println("maxBy:val  =>  " + map.maxBy(_._2))
    println("minBy:key  =>  " + map.minBy(_._1))
    println("minBy:val  =>  " + map.minBy(_._2))
    println("---- maxBy/minBy end ----")
  }

  def test(): Unit = {
    val set = scala.collection.JavaConversions.asScalaSet(System.getProperties.stringPropertyNames())
    var max = 0
    for (s <- set)
      max = math.max(max, s.length)
    //println(max)
    for (s <- set) {
      val len = max - s.length
      val sb = new mutable.StringBuilder(s)
      for (i <- 0 until len)
        sb.append(' ')
      printf("%s | %s\n", sb.toString(), System.getProperty(s))
    }
  }
}

执行结果:

---- testBasic  start ----

----define start----
map1:  Map(id -> 1, name -> Alice, age -> 22)
map2:  Map(age -> 22, name -> Alice, id -> 1)
map3:  Map()
----define end----

----getValue start----
map1:get(id)    =>   1
map2:get(name)    =>   Alice
map3:get(name)    =>   null
map3:getOrElse(name)    =>   null
----getValue end----

----updateValue start----
map1:update(name)&add(grade) to map4   =>   Map(id -> 1, name -> Neo, age -> 22, grade -> 12)
map2:update(name)    =>   Map(age -> 22, name -> Bob, id -> 1)
----updateValue end----

----addValue start----
map1:add(score,grade) to map5   =>   Map(id -> 1, name -> Alice, age -> 22, score -> 99)
map2:add(score,grade)   =>   Map(age -> 22, name -> Bob, grade -> 10, score -> 95, id -> 1)
----addValue end----

----removeValue start----
map2:remove(score)   =>   Map(age -> 22, name -> Bob, grade -> 10, id -> 1)
----removeValue end----
---- testBasic  end ----
---- testTraverse  start ----
遍历map1的key-value:  (Alice,'10')(Bob,'12')(Candy,'15')(David,'18')
基于map1生成map2:  Map(100 -> Alice, 144 -> Bob, 225 -> Candy, 324 -> David)
遍历map1的key:  Alice  Bob  Candy  David  
遍历map1的value:  10  12  15  18  
map1.keySet  =>  Set(Alice, Bob, Candy, David)
---- testTraverse  end ----
---- filter start ----
filter  =>  Map(alice -> 98)
filterNot  =>  Map(david -> 82, Harry -> 78, Bob -> 86, Candy -> 90, Ellen -> 78)
filter  =>  Map(david -> 82, alice -> 98)
filterKeys  =>  Map(david -> 82, alice -> 98)
---- filter end ----

---- find start ----
find(找到一个就返回)  =>  Some((david,82))
---- find end ----

---- maxBy/minBy start ----
maxBy:key  =>  (david,82)
maxBy:val  =>  (alice,98)
minBy:key  =>  (Bob,86)
minBy:val  =>  (Harry,78)
---- maxBy/minBy end ----
---- test start ---
java.runtime.name             | ****
sun.boot.library.path         | ****
java.vm.version               | ****
gopherProxySet                | ****
java.vm.vendor                | ****
java.vendor.url               | ****
path.separator                | ****
java.vm.name                  | ****
file.encoding.pkg             | ****
user.country                  | ****
sun.java.launcher             | ****
sun.os.patch.level            | ****
java.vm.specification.name    | ****
user.dir                      | ****
java.runtime.version          | ****
java.awt.graphicsenv          | ****
java.endorsed.dirs            | ****
os.arch                       | ****
java.io.tmpdir                | ****
line.separator                | ****
java.vm.specification.vendor  | ****
os.name                       | ****
sun.jnu.encoding              | ****
java.library.path             | ****
java.specification.name       | ****
java.class.version            | ****
sun.management.compiler       | ****
os.version                    | ****
http.nonProxyHosts            | ****
user.home                     | ****
user.timezone                 | ****
java.awt.printerjob           | ****
file.encoding                 | ****
java.specification.version    | ****
user.name                     | ****
java.class.path               | ****
java.vm.specification.version | ****
sun.arch.data.model           | ****
java.home                     | ****
sun.java.command              | ****
java.specification.vendor     | ****
user.language                 | ****
awt.toolkit                   | ****
java.vm.info                  | ****
java.version                  | ****
java.ext.dirs                 | ****
sun.boot.class.path           | ****
java.vendor                   | ****
file.separator                | ****
java.vendor.url.bug           | ****
sun.cpu.endian                | ****
sun.io.unicode.encoding       | ****
socksNonProxyHosts            | ****
ftp.nonProxyHosts             | ****
sun.cpu.isalist               | ****
---- test end ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值