2015-04-23 13 views
1

我有一個這樣的文件:如何處理十進制數在斯卡拉

1 4.146846 
2 3.201141 
3 3.016736 
4 2.729412 

我想用toDouble但是,它不是按預期工作:

val rows = textFile.map { line => 
    val fields = line.split("[^\\d]+") 
    ((fields(0),fields(1).toDouble))  
} 

val Num = rows.sortBy(- _._2).map{case (user , num) => num}.collect.mkString("::") 

println(Num) 

結果打印出來的4.0::3.0::3.0::2.0
我期望的是4.146846::3.201141::3.016736::2.729412

我該怎麼做?

+0

另見http://stackoverflow.com/questions/12643009/regular-expression-for-floating-point-numbers – Odomontois

+1

嘛....問題你的正則表達式...'「[^ \\ d] +」'它將行分割爲3.'fields:Array [String] = Array(1,4,146846)'。 –

+0

只需將您的正則表達式更改爲'「[^ \\ d。] +」'。 –

回答

4

您的正則表達式正在停止在小數點4.146846

嘗試line.split("[^\\d.]+")

0

怎麼樣通過分裂空格的變體號線?正則表達式就像'[\ s] +'。這將以每行兩個部分重新開始,一個數字和一個雙重字符串。

我的整個程序是這樣的:

object Application { 
    def parseDouble(s: String) = 
    try { 
     Some(s.toDouble) 
    } catch { 
     case _ => None 
    } 

    def main(args: Array[String]): Unit = { 
    val linesIt = "1 3.201141\n2 4.146846\n3 3.016736\n4 2.729412".lines 
    var doubles: List[Double] = List.empty 
    for (singleLine <- linesIt) { 
     val oneDouble = parseDouble(singleLine.split("[\\s]+")(1)) 
     doubles = if (oneDouble != None) 
     oneDouble.get::doubles 
     else 
     doubles 
    } 
    val doublesArr = doubles.toArray 
    println("before sorting: " + doublesArr.mkString("::")) 
    scala.util.Sorting.quickSort(doublesArr) 
    println("after sorting: " + doublesArr.mkString("::")) 
    } 
}