使用>比较Scala中的两个字符串和<

时间:2017-04-26 21:58:23

标签: string scala

我试图比较Scala中的两个字符串,试图找出字母表中的第一个字符串。即在 b 之前 a ,在 abb 之前 aab 等等。

似乎><运营商正在完成这项工作:

  

阶&GT; &#34; B&#34; &GT; &#34;&#34;

     

res14:Boolean = true

     

阶&GT; &#34; B&#34; &LT; &#34;&#34;

     

res15:Boolean = false

     

阶&GT; &#34; AAB&#34; &LT; &#34; ABB&#34;

     

res16:Boolean = true

然而,doc并没有让我知道这是什么,并且在线教程似乎都没有使用这种方法来比较字符串。因此,我想知道:

  • 这是一种做我想做的事情的安全方法吗,即按字母顺序比较两个字符串?

  • 我在这里缺少一种更常见的Scala方法吗?

  • 它究竟是如何运作的 - 例如

  

阶&GT; &#34;&#34; &GT; &#34;!&#34;   res25:Boolean = true

对我来说不直观。

2 个答案:

答案 0 :(得分:3)

正如您在文档中看到的那样,您可以将>(以及所有其他人)用于String。最终,这会将String的元素分解为基础Char,并且它们是unicode。因此,您需要比较它们的unicode值,以模拟scalac展示的逻辑。

参考明确的list人发现

  
    

U + 0021! !感叹号

  

  
    

U + 003F? ?问号

  

所以,!<?确实是true

我相信比较操作对于您可以提供的任何unicode序列都是安全的。见甚至:

val string1 = "\u2200"
val string2 = "\uFB30"

string1 < string2

val string3 = string1 + string2
val string4 = string2 + string1

string3 < string4
string4 < string3

string3 == string1 + string2
string4 == string1 + string2

在我的工作表中给了我:

string1: String = ∀
string2: String = אּ // note: aleph comes after All in the unicode definition.

res7: Boolean = true

string3: String = ∀אּ
string4: String = אּ∀

res8: Boolean = true
res9: Boolean = false

res10: Boolean = true
res11: Boolean = false

答案 1 :(得分:2)

  

究竟是如何运作的

>和其他比较运算符委托给compareTo方法,其确切行为记录在https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#compareTo(java.lang.String)。例如。 x > yx.compareTo(y) > 0相同。

  

这是一种做我想做的事情的安全方法,即比较两个字符串的字母顺序吗?

没有。如果你考虑案例(和变音符号,和......),它提供 顺序,但不提供字母顺序。例如。 "b" > "A"是假的。

对于完全按字母顺序排序,您可能需要Collator。 (我还建议阅读https://english.stackexchange.com/a/212630/26340以开始欣赏规则的重要性,即使只是英语规则。