gpt4 book ai didi

scala - 如何在 Scala 中对大写和小写字符串进行排序

转载 作者:行者123 更新时间:2023-12-04 06:34:53 24 4
gpt4 key购买 nike

Scala 中有一个字符串列表。让我们假设这些字符串只包含英文字母(小写和大写)。这是示例列表:

val l1 = List("ab","aa", "bc","Aa", "Ab", "Ba", "BB")

当我们使用以下代码对其进行排序时:

l1.sortWith(_ < _)  

我们将收到:

List(Aa, Ab, BB, Ba, aa, ab, bc)

所以这个排序使用字母之间的以下关系:

A < B < C < ... < a < b < c ...

我们还可以使用:

l1.sortWith(_.toLowerCase < _.toLowerCase)

接收:

List(aa, Aa, ab, Ab, Ba, BB, bc)

那么现在字母之间的关系是:

(a=A) < (b=B) < (c=C) ...

但是如何在 Scala 中使用以下字母顺序对它们进行排序? :

a < A < b < B < c < C ...

所以结果应该是;

List(aa, ab, Aa, Ab, bc, Ba, BB)

最佳答案

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)

关于scala - 如何在 Scala 中对大写和小写字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27662900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com