scala> def compareChar(c1:Char, c2:Char) = {
if ( c1 == c2 ) None
else if (c1.toLower == c2.toLower) Some(c2.isUpper)
else Some(c1.toLower < c2.toLower)
}
compareChar: (c1: Char, c2: Char)Option[Boolean]
scala> def compareString(s1:String, s2:String) : Boolean = {
(s1 zip s2).collectFirst {
case (c1,c2) if (compareChar(c1,c2).isDefined) => compareChar(c1,c2).get
}.getOrElse(s1.length < s2.length)
}
compareString: (s1: String, s2: String)Boolean
scala> l1 sortWith compareString
res02: List[String] = List(aa, ab, Aa, Ab, bc, Ba, BB)
编辑:
内联版本:
def compareString(s1:String, s2:String) : Boolean = {
(s1 zip s2).collectFirst {
case (c1, c2) if c1 == c2 => compareString(s1.tail, s2.tail)
case (c1, c2) if c1.toLower == c2.toLower => c2.isUpper // same letter, different case, uppercase wins
case (c1, c2) => c1.toLower < c2.toLower
}.getOrElse(s1.length < s2.length) // same prefix, the longest string is bigger
}
scala> val l1 = List("ab","aa", "bc","Aa", "Ab", "Ba", "BB")
l1: List[String] = List(ab, aa, bc, Aa, Ab, Ba, BB)
scala> l1 sortWith compareString
res0: List[String] = List(aa, ab, Aa, Ab, bc, Ba, BB)
scala> List("ABC","AB") sortWith compareString
res1: List[String] = List(AB, ABC)