-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgeneric-sort-by.sc
63 lines (54 loc) · 2.42 KB
/
generic-sort-by.sc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
case class User(name: String = "", age: Int = 0, value: Double = 0.0)
val useStreams: String => String = { spacedString =>
val first = spacedString.take(1).toLowerCase
val rest =
spacedString.toStream.sliding(2).foldLeft("") { (str, charStream) =>
val added = charStream.toList match {
case ' ' :: ' ' :: _ => ""
case ' ' :: '_' :: _ => ""
case '_' :: ' ' :: _ => ""
case '_' :: '_' :: _ => ""
case ' ' :: other => other.mkString.toUpperCase
case '_' :: other => other.mkString.toUpperCase
case _ :: other :: _ if other != ' ' && other != '_' =>
other.toLower.toString
case _ => ""
}
str + added
}
first + rest
}
implicit class StringCamel(str: String) {
def toCamelCase: String = {
useStreams(str)
}
}
def getSorted(order: String, desc: Int, data: Vector[User]): Vector[User] = {
val fields = User().getClass.getDeclaredFields.map(_.getName)
val index = fields.indexOf(order.toCamelCase)
val element = data.headOption.map(_.productElement(index)).getOrElse("")
(desc) match {
case (0) =>
element match {
case _: String => data.sortBy(_.productElement(index).asInstanceOf[String])
case _: Double => data.sortBy(_.productElement(index).asInstanceOf[Double])
case _: Long => data.sortBy(_.productElement(index).asInstanceOf[Long])
case _: Int => data.sortBy(_.productElement(index).asInstanceOf[Int])
case _ => data.sortBy(_.productElement(index).asInstanceOf[String])
}
case _ => {
element match {
case _: String => data.sortBy(_.productElement(index).asInstanceOf[String])(Ordering[String].reverse)
case _: Double => data.sortBy(_.productElement(index).asInstanceOf[Double])(Ordering[Double].reverse)
case _: Long => data.sortBy(_.productElement(index).asInstanceOf[Long])(Ordering[Long].reverse)
case _: Int => data.sortBy(_.productElement(index).asInstanceOf[Int])(Ordering[Int].reverse)
case _ => data.sortBy(_.productElement(index).asInstanceOf[String])(Ordering[String].reverse)
}
}
}
}
val list = Vector(User("a", 0, 0.1), User("b", 1, 0.2), User("c", 2, 0.3), User("d", 3, 0.4))
println(getSorted("name", 0, list))
println(getSorted("name", 1, list))
println(getSorted("age", 0, list))
println(getSorted("age", 1, list))