如何在Scala中对大写和小写字符串进行排序
发布时间:2020-12-16 09:07:27 所属栏目:安全 来源:网络整理
导读:Scala中有一个字符串列表.让我们假设这些字符串只包含英文字母(小写和大写).以下是示例清单: val l1 = List("ab","aa","bc","Aa","Ab","Ba","BB") 当我们用以下代码对它进行排序时: l1.sortWith(_ _) 我们会收到: List(Aa,Ab,BB,Ba,aa,ab,bc) 所以这种排
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,bc) 所以现在字母之间的关系是: (a=A) < (b=B) < (c=C) ... 但是如何使用以下字母顺序在Scala中对它们进行排序? : a < A < b < B < c < C ... 所以结果应该是; List(aa,bc,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,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","BB") l1: List[String] = List(ab,BB) scala> l1 sortWith compareString res0: List[String] = List(aa,BB) scala> List("ABC","AB") sortWith compareString res1: List[String] = List(AB,ABC) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |