2015-07-28 62 views
2

目前我有這有以下內容的文本字段的情況下類:自然/人訂購的字符串(案例類與字符串)

2 AT 30% 
    2 AT 40% 
    2 AT 50% 
    5 AT 30% 
    5 AT 40% 
    5 AT 50% 
    10 AT 30% 
    10 AT 40% 
    11 AT 30% 
    12 AT 30% 

目前,他們是無序的,這樣5日將是2之前AT等..有一個簡單的方法來自然地命令他們還是需要有類似的東西:

object ExtraCostOrdering extends Ordering[[ExtraCost] { 


    override def compare(x: List[ExtraCost], y: List[ExtraCost]): Int = { 

    } 
} 

而且我怎麼做對了嗎?

它應該自然排序以便 2,3,4,5,6,7,8,9,10,11而不是11,12,2,3,4 大多數帶有數字排序的文本字段是錯誤的。

編輯:有時候,這個名單可以包含字符串沒有任何號碼都這麼

5 AT 50% 
    10 AT 30% 
    10 AT 40% 
    I'm a String 

是有效的,太。

回答

3

AFAIK自然排序順序不內置斯卡拉。但是,可以通過轉換爲整數類型方便地模擬它:

鑑於以下定義...

def asNatural(row: String) = row.split(" ").head.toInt 

val myList = List("5 AT 30%","12 AT 30%", "2 AT 40%", "5 AT 50%", "5 AT 40%") 

...您可以使用sortBy做一個自然排序。 。

scala> myList.sortBy(asNatural) 
res2: List[String] = List(2 AT 40%, 5 AT 30%, 5 AT 50%, 5 AT 40%, 12 AT 30%) 

當然,上面會如果您有任何格式混亂的字符串在未來的失敗以下是稍微「生產就緒」,並把所有的錯誤格式的字符串結尾:

import scala.util.Try 

def asNatural(row: String) = 
    row.split(" ").headOption 
       .flatMap{ head => Try(head.toInt).toOption } 
       .getOrElse(Integer.MAX_VALUE) 
+0

只要我的List [String]沒有與不包含任何數字的字符串混合,就可以工作。我有時候列表還可以包含一個純字符串。但仍然你的解決方案是偉大的 –

+1

謝謝 - 我添加了一些示例錯誤處理。儘管你可能會更好地過濾出格式不完整的行。 – jazmit

+0

感謝所有這些,在其他語言中我有一個正則表達式,這真的很奇怪,但是您的解決方案非常快速,但是我分割了這個列表,因此我不需要「格式不正確」的解決方案,謝謝。 –

-1

既然你想要的順序是標準的,你可能只是這樣做:

val sorted: List[ExtraCost] = unsorted.sortWith((a,b) => a.textField > b.textField) 
+0

這不是一個自然的排序順序。 –