从Long转换为List [Int]

时间:2014-03-30 22:40:17

标签: scala

我正在尝试将Long转换为List[Int],其中列表中的每个项目都是原始Long的单个数字。

scala> val x: Long = 123412341L
x: Long = 123412341

scala> x.toString.split("").toList
res8: List[String] = List("", 1, 2, 3, 4, 1, 2, 3, 4, 1)

scala> val desired = res8.filterNot(a => a == "")
desired: List[String] = List(1, 2, 3, 4, 1, 2, 3, 4, 1)

使用split("")会产生一个我不想拥有的""列表元素。

我可以简单地过滤它,但是我可以更清楚地从123412341L转到List(1, 2, 3, 4, 1, 2, 3, 4, 1)吗?

3 个答案:

答案 0 :(得分:12)

如果你想要数字的整数值,可以这样做:

scala> x.toString.map(_.asDigit).toList
res65: List[Int] = List(1, 2, 3, 4, 1, 2, 3, 4, 1)

请注意.map(_.asDigit)所带来的差异:

scala> x.toString.toList
res67: List[Char] = List(1, 2, 3, 4, 1, 2, 3, 4, 1)

scala> res67.map(_.toInt)
res68: List[Int] = List(49, 50, 51, 52, 49, 50, 51, 52, 49)

x.toString.toList是一个字符列表,即List('1','2','3',...)。列表的toString呈现使它看起来相同,但两者完全不同 - 例如,'1'字符具有整数值49.您应该使用哪个取决于您是否需要数字字符或者它们代表的整数。

答案 1 :(得分:0)

快速而且有点hacky:

x.toString.map(_.toString.toInt).toList

答案 2 :(得分:0)

正如下面Alexey所指出的,这段代码存在严重问题:\不要使用它。

不使用字符串转换:

def splitDigits(n:Long): List[Int] = {
  n match {
    case 0 => List()
    case _ => {
      val onesDigit = (n%10)
      splitDigits((n-onesDigit)/10) ++ List( onesDigit.toInt )
    }
  }
}

给出:

splitDigits(123456789)    //> res0: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
splitDigits(1234567890)   //> res1: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
splitDigits(12345678900L) //> res2: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0)

该函数不是尾递归的,但它应该适用于Long值:

splitDigits(Long.MaxValue) //> res3: List[Int] = List(9, 2, 2, 3, 3, 7, 2, 0, 3, 6, 8, 5, 4, 7, 7, 5, 8, 0, 7)