fork download
  1. object Main extends App {
  2. val data = Seq("file9b", "file456b", "file1c")
  3.  
  4. def translate(s: String) = {
  5. val it = "([^\\d]*)(\\d+)([^\\d]*)".r.findAllIn(s)
  6. it.matchData.flatMap(m =>
  7. (1 to 3).map {i =>
  8. val part = try m.group(i) catch {case e => ""}
  9. if (i == 2) part.toInt else part
  10. }).toSeq
  11. }
  12.  
  13. def listOrdering[T: Ordering]: Ordering[Seq[T]] = new Ordering[Seq[T]] {
  14. def compare(x: Seq[T], y: Seq[T]) = x.view.zip(y).map(p => implicitly[Ordering[T]].compare(p._1, p._2))
  15. .find(_ != 0).getOrElse(x.size.compareTo(y.size))
  16. }
  17.  
  18. val ordering = Ordering.fromLessThan[Any] {
  19. case (a: Int, b: Int) => a < b
  20. case (a, b) => a.toString < b.toString
  21. }
  22. println(data.sorted)
  23. println(data.sortBy(translate)(listOrdering(ordering)))
  24. /*
  25.   import scalaz._
  26.   import Scalaz._
  27.   import Order._
  28.   new OrderLow{
  29.   println(data.sorted(OrderOrdering(orderBy(translate)(IterableOrder(ScalaOrderingOrder(ordering))))))
  30.   }
  31.  */
  32. }
  33.  
Success #stdin #stdout 0.41s 247552KB
stdin
Standard input is empty
stdout
List(file1c, file456b, file9b)
List(file1c, file9b, file456b)