2014-12-04 25 views
4

让我们定义字符串为“按字母顺序成长”时:如果字符串'按字母顺序增长',如何检查Scala?

  1. 每一封信是按字母顺序更大然后前一个。
  2. 如果字母是大写或不是大写。

这些字符串是 '按字母顺序成长':

  • “ABCDE”
  • “aBfJz”

而且这些都不是:

  • “ABBCD”
  • “abdDz”
  • “零余额账户”

让我们假设我们正在检查它仅包含字母的字符串。 检查是否字符串为“成长”,可以在Scala中实现与下面的代码:

val str = "aBgjz" 
val growing = str.map(_.toLower).toSet.toList.sortWith(_ < _).mkString.equals(str.map(_.toLower)) 

此代码的工作不错,但仅适用于英文字母。对于带有波兰字母的字符串,结果是错误的。在波兰的字母是按照以下顺序:
A,A,B,C,C,d,E ...
所以:

val str = "aąbćdgz" 

结果应该是 '真'。所以问题是:
如何检查斯卡拉如果给定字符串是'按字母顺序增长'的给定语言环境?

val str = "aąbćdgz" 
val locale_id = "pl_PL" 
.... 
val growing = ...... 
+1

退房这篇文章,可能会有帮助:http://stackoverflow.com/questions/24860138/sort-列表的字符串,用定位功能于斯卡拉 – rfolt 2014-12-04 22:29:11

回答

7
scala> import java.util.Locale 
scala> import java.text.Collator 
scala> val collator = Collator.getInstance(new Locale("pl_PL")) 

scala> val str = "aąbćdgz" 
str: String = aąbćdgz 

scala> str.map(_.toLower).toSet.toList.sortWith((s1:Char, s2:Char) => collator.compare(s1.toString, s2.toString) < 0).mkString.equals(str.map(_.toLower)) 
res06: Boolean = true 

虽然我觉得这更容易阅读:

scala> (str, str.tail).zipped.forall { case (s1,s2) => collator.compare(s1.toString,s2.toString) < 0 } 
res08: Boolean = true 
相关问题