Scala中的字符串

43 阅读5分钟

一、string的定义

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

定义格式:

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

2.三引号。支持换行。

val str1 = "静夜思 李白 22222222222222"

val str2 =
  """
    静夜思
    李白
    窗前明月光,
    疑是地上霜
    """
    println(str1)
    println(str2)

运行结果:

屏幕截图 2025-12-09 083309.png

二、string的常用方法

  • 常见操作

  • 1.获取单个字符

  • 2.字符串长度,空格也是有效的字符,它也会占长度

  • 3.字符串的截取:从当前字符串中,截取一段出来 subString(起点下标,终点下标-不包含)

  • 4.转成数字

val str1 = "hello scala"
// 字符串(下标),下标从0开始。
println(str1(0))
println("字符串的长度是:" + str1.length)
// 把 ello 这四个字符取出来
val str2 = str1.substring(1,5)
println(str2)
// 把 cal 这三个字符取出来?
val str3 = "我的手机号第三位是3"
// 把 3 截取出来
val str4 = str3.substring(10,12)  // str4是一个字符串"3"
println(str4 + 10) // 310

val n = str4.toInt
println(n + 1)

三、身份证号的基本知识

前2位是省市的信息;

后四位是具体的乡镇信息;

接下来8位是生日;

倒数第2位表示性别;

最后一位是校验码;

四、任务:从键盘输入一个身份证号

要求:

写出身份信息分析结果。

籍贯、性别、年龄、生日、星座、性格特征。

// 身份证前两位地区映射
val regionMap: Map[String, String] = Map(
  "11" -> "北京市", "12" -> "天津市", "13" -> "河北省", "14" -> "山西省", "15" -> "内蒙古自治区",
  "21" -> "辽宁省", "22" -> "吉林省", "23" -> "黑龙江省",
  "31" -> "上海市", "32" -> "江苏省", "33" -> "浙江省", "34" -> "安徽省", "35" -> "福建省",
  "36" -> "江西省", "37" -> "山东省", "41" -> "河南省", "42" -> "湖北省", "43" -> "湖南省",
  "44" -> "广东省", "45" -> "广西壮族自治区", "46" -> "海南省", "50" -> "重庆市", "51" -> "四川省",
  "52" -> "贵州省", "53" -> "云南省", "54" -> "西藏自治区", "61" -> "陕西省", "62" -> "甘肃省",
  "63" -> "青海省", "64" -> "宁夏回族自治区", "65" -> "新疆维吾尔自治区", "71" -> "台湾省",
  "81" -> "香港特别行政区", "82" -> "澳门特别行政区"
)

// 星座日期范围定义
private val zodiacRanges = List(
  ((3, 21), (4, 19), "白羊座"),
  ((4, 20), (5, 20), "金牛座"),
  ((5, 21), (6, 21), "双子座"),
  ((6, 22), (7, 22), "巨蟹座"),
  ((7, 23), (8, 22), "狮子座"),
  ((8, 23), (9, 22), "处女座"),
  ((9, 23), (10, 23), "天秤座"),
  ((10, 24), (11, 22), "天蝎座"),
  ((11, 23), (12, 21), "射手座"),
  ((12, 22), (1, 19), "摩羯座"),
  ((1, 20), (2, 18), "水瓶座"),
  ((2, 19), (3, 20), "双鱼座")
)

// 函数
def getZodiacPersonality(zodiac: String): String = {
  zodiac match {
    case "白羊座" => "热情勇敢、行动力强、冲动直接、领导力强"
    case "金牛座" => "稳重务实、有耐心、固执保守、追求稳定"
    case "双子座" => "聪明机智、好奇心强、善变灵活、沟通能力好"
    case "巨蟹座" => "情感细腻、家庭观念强、敏感多疑、保护欲强"
    case "狮子座" => "自信大方、有领导力、爱面子、慷慨热情"
    case "处女座" => "细心谨慎、追求完美、分析力强、有些挑剔"
    case "天秤座" => "优雅和谐、公正平衡、犹豫不决、社交能力强"
    case "天蝎座" => "深沉神秘、直觉敏锐、占有欲强、意志坚定"
    case "射手座" => "乐观开朗、热爱自由、冒险精神、直率坦诚"
    case "摩羯座" => "务实稳重、责任感强、目标明确、有些保守"
    case "水瓶座" => "独立思考、创新思维、友善博爱、略显叛逆"
    case "双鱼座" => "温柔浪漫、富有同情心、想象力丰富、敏感脆弱"
    case _ => "性格特征未知"
  }
}

def main(args: Array[String]): Unit = {
  //    println("请输入身份证号码:")
  //    val idCard = scala.io.StdIn.readLine().trim
  val idCard = "123456789012345678" // 身份证号码

  if (validateIdCard(idCard)) {
    analyzeIdCard(idCard)
  } else {
    println("身份证号码格式错误!")
  }
}

/**
 * 根据月份和日期判断星座
 * @param month 月份 (1-12)
 * @param day 日期 (1-31)
 * @return 星座名称
 */
def getZodiac(month: Int, day: Int): String = {
  require(month >= 1 && month <= 12, "月份必须在1-12之间")
  require(day >= 1 && day <= 31, "日期必须在1-31之间")

  // 将日期转换为统一格式进行比较
  val dateValue = month * 100 + day

  zodiacRanges.find { case ((startMonth, startDay), (endMonth, endDay), _) =>
    val startValue = startMonth * 100 + startDay
    val endValue = endMonth * 100 + endDay

    if (startMonth <= endMonth) {
      // 正常区间(同一年内)
      dateValue >= startValue && dateValue <= endValue
    } else {
      // 跨年区间(摩羯座、水瓶座、双鱼座)
      dateValue >= startValue || dateValue <= endValue
    }
  }.map(_._3).getOrElse("未知星座")
}

def validateIdCard(idCard: String): Boolean = {
  idCard.matches("^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$")
}

def analyzeIdCard(idCard: String): Unit = {
  // 提取地区代码
  val regionCode = idCard.substring(0, 2)
  val region = regionMap.getOrElse(regionCode, "未知地区")

  // 提取性别(第17位,奇数为男,偶数为女)
  val genderDigit = idCard.charAt(16).toString.toInt
  val gender = if (genderDigit % 2 == 1) "男" else "女"

  // 提取生日
  val birthdayStr = idCard.substring(6, 14)
  val formatter = DateTimeFormatter.ofPattern("yyyyMMdd")
  val birthday = LocalDate.parse(birthdayStr, formatter)
  val formattedBirthday = birthday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))

  // 计算年龄
  val currentDate = LocalDate.now()
  val age = ChronoUnit.YEARS.between(birthday, currentDate).toInt

  // 提取月份
  val month = idCard.substring(10, 12).toInt
  // 提取日期
  val day = idCard.substring(12, 14).toInt

  val zodiac =  getZodiac(month, day)

  val personality= getZodiacPersonality(zodiac)

  // 输出结果
  println("身份证信息分析结果:")
  println("籍贯:" + region)
  println("性别:" + gender)
  println("年龄:" + age + "岁")
  println("生日:" + formattedBirthday)
  println("星座:" + zodiac)
  println("性格:" + personality)
}

运行结果举例:

屏幕截图 2025-12-09 111848.png