我试图比较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
对我来说不直观。
答案 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 > y
与x.compareTo(y) > 0
相同。
这是一种做我想做的事情的安全方法,即比较两个字符串的字母顺序吗?
没有。如果你考虑案例(和变音符号,和......),它提供 顺序,但不提供字母顺序。例如。 "b" > "A"
是假的。
对于完全按字母顺序排序,您可能需要Collator
。
(我还建议阅读https://english.stackexchange.com/a/212630/26340以开始欣赏规则的重要性,即使只是英语规则。