34 scala中的字符串-身份证中的秘密

34 阅读1分钟

(一)String 的定义

String 在 Scala 中是不可变的字符序列,这意味着一旦创建,其内容就不能被修改。

定义格式:

1.双引号: val str = "xxxx"

2.三引号。支持换行。

package string

/*
* String 类型:字符串
* 定义字符串:
* 1. 双引号
* 2. 三引号
*/
object stringid01 {
  def main(args: Array[String]): Unit = {
    val name = "小花"

    val str = s"I like scala, ${name}"

    val content = """
                 静夜思
                  李白
                床前明月光,
                疑是地上霜。
                举头望明月,
                低头思故乡。
     """

    println(content)
  }
}

image.png

(二)String 的常用方法

1.索引访问 2. 长度获取

package string
/*
String的处理:
1. 长度:length属性
2. 下标:从0开始,表示每一个字符
3. 截取:在一个字符串中,取出一部分
 */
object stringid02 {
  def main(args: Array[String]): Unit = {

    val str = "hello scala"

    println(str.length)

    println(str(0))

    // 取出“llo”这个三个字符
    println(str.substring(2,5))
    // 取出“cal”这个三个字符
    println(str.substring(7,10))
  }
}

image.png

3. 子串提取* 4.字符串转成数字*

import java.time.LocalDate

/*
案例:拆分身份证号码的秘密
1. 倒数第二个数:奇数:男;偶数:女
*/
object stringid03 {
  // 奇数:男;偶数:女
  def getGender(idCard: String): String = {
    val g = idCard.substring(16, 17).toInt
    if (g % 2 == 1) {
      "男"
    } else {
      "女"
    }
  }
  def getProvince(idCard: String): String = {
    val code = idCard.substring(0,2) // 11
    val map = Map("11"->"北京", "12"->"天津", "13"->"河北",
      "14"->"山西", "15"->"内蒙古", "21"->"辽宁", "22"->"吉林",
      "23"->"黑龙江", "31"->"上海", "32"->"江苏", "33"->"浙江",
      "34"->"安徽", "35"->"福建", "36"->"江西", "37"->"山东", "41"->"河南")
    map.getOrElse(code, "未知")
  }
  def getBirthday(idCard: String): String = {
    val month = idCard.substring(10,12)
    val day = idCard.substring(12,14)
    month + "-" + day
  }

  def getZodiac(idCard: String): String = {
    val month = idCard.substring(10,12).toInt
    val day = idCard.substring(12,14).toInt
    if ((month == 1 && day >= 20) || (month == 2 && day <= 18)) "水瓶座"
    else if ((month == 2 && day >= 19) || (month == 3 && day <= 20)) "双鱼座"
    else if ((month == 3 && day >= 21) || (month == 4 && day <= 19)) "白羊座"
    else if ((month == 4 && day >= 20) || (month == 5 && day <= 20)) "金牛座"
    else if ((month == 5 && day >= 21) || (month == 6 && day <= 21)) "双子座"
    else if ((month == 6 && day >= 22) || (month == 7 && day <= 22)) "巨蟹座"
    else if ((month == 7 && day >= 23) || (month == 8 && day <= 22)) "狮子座"
    else if ((month == 8 && day >= 23) || (month == 9 && day <= 22)) "处女座"
    else if ((month == 9 && day >= 23) || (month == 10 && day <= 23)) "天秤座"
    else if ((month == 10 && day >= 24) || (month == 11 && day <= 22)) "天蝎座"
    else if ((month == 11 && day >= 23) || (month == 12 && day <= 21)) "射手座"
    else if ((month == 12 && day >= 22) || (month == 1 && day <= 19)) "摩羯座"
    else "未知"
  }

  def getAge(idCard: String): Int = {
    // 提取身份证的出生年份
    val year = idCard.substring(6,10)
    // 今年的年份 - year
    LocalDate.now().getYear - year.toInt
  }

  def getInfo(zodiac: String): String = {
    val map = Map(
      "白羊座" -> "热情冲动,充满活力,喜欢追求新鲜感,但有时比较暴躁,固执己见。",
      "金牛座" -> "稳重务实,脚踏实地,重视物质享受,也有顽固的一面,对钱财看得较重。",
      "双子座" -> "思维敏捷,沟通能力强,善于交际,但有时不太专注,缺乏耐性。",
      "巨蟹座" -> "心思敏感,细腻温柔,重视家庭,但容易情绪化,不够理性。",
      "狮子座" -> "自信乐观,有领导能力,讲义气,但有时过于自负,爱面子。",
      "处女座" -> "细致严谨,追求完美,待人友善,但有时过于挑剔,吹毛求疵。",
      "天秤座" -> "优雅迷人,公正温和,善于协调人际关系,但有时会犹豫,摇摆不定。",
      "天蝎座" -> "洞察力强,思维深邃,但有时性格高冷,多疑记仇。",
      "射手座" -> "乐观豁达,自由包容,但有时粗心大意,缺乏沉稳。",
      "摩羯座" -> "沉稳内敛,耐心坚韧,责任心强,但有时刻板,缺乏情趣。",
      "水瓶座" -> "创新独立,脑洞大开,善于思考,但有时特立独行,难以捉摸。",
      "双鱼座" -> "温柔善良,富有同情心,想象力丰富,但有时多愁善感,粗心大意"
    )
    map.getOrElse(zodiac, "未知")
  }

  def main(args: Array[String]): Unit = {
    val idCard = "149005200403030083"
    val gender = getGender(idCard)
    val birthday = getBirthday(idCard)
    val age = getAge(idCard)
    val province = getProvince(idCard)
    val zodiac = getZodiac(idCard)
    val info = getInfo(zodiac)
    println("-----------------")
    println(s"籍贯: ${province}")
    println(s"性别: ${gender}")
    println(s"年龄: ${age}")
    println(s"生日: ${birthday}")
    println((s"性格: ${info}"))
    println(s"星座: ${zodiac}")
  }
}

image.png