String 使用>;比较Scala中的两个字符串;及<;

String 使用>;比较Scala中的两个字符串;及<;,string,scala,String,Scala,我试图比较Scala中的两个字符串,试图找出字母表中哪一个是第一位的。即a在b之前,aab在abb之前,等等 似乎和“b”>“a” res14:Boolean=true scala>“b”“aab”“?”>“!” res25:Boolean=true 这不是我的直觉 正如您在文档中看到的,您可以将定义的(以及所有其他)用于字符串。最终,这会将字符串的元素分解为底层Chars,它们是unicode。因此,您需要比较unicode值以模拟scalac显示的逻辑 参考一个确定的结论,我们发现 U+00

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

似乎
“b”>“a”

res14:Boolean=true

scala>“b”<“a”

res15:布尔值=假

scala>“aab”<“abb”

res16:Boolean=true

然而,这个方法并没有告诉我它到底有什么作用,而且在线教程似乎都没有使用这个方法来比较字符串。因此,我想知道:

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

  • 在Scala中是否有一种更常见的方法,我在这里遗漏了

  • 它到底是如何工作的——例如

scala>“?”>“!” res25:Boolean=true


这不是我的直觉

正如您在文档中看到的,您可以将定义的
(以及所有其他)用于
字符串。最终,这会将
字符串的元素分解为底层
Char
s,它们是unicode。因此,您需要比较unicode值以模拟scalac显示的逻辑

参考一个确定的结论,我们发现

U+0021!感叹号

U+003F?问号

所以,事实上,
!
它到底是如何工作的

和其他比较运算符委托给
compareTo
方法,其确切行为记录在。例如,
x>y
x.compareTo(y)>0
相同

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

不。如果你考虑到大小写(和变音符号,和…),它提供了一个顺序,但不是字母顺序。例如,
“b”>“A”
为假

对于完整的字母顺序,您可能需要一个。
(我还建议阅读,开始了解这些规则对于英语来说是多么重要)。

我相信,对于您可以提供的任何unicode序列,比较操作都是故障安全的”,如果您的意思是它提供了一致的结果,并且从不引发异常,那么是的。但是这个结果与字母顺序不同:只需比较
“A”
“b”
,我的意思是它只是一致的。我试图解释通过表引用进行排序的机制,从该表中可以明显看出,大小写很重要。依赖ascii的传统字符比较也有同样的趋势。在比较字符串时,请将字符串完全大写或小写:)感谢Alexey给出的完整答案!我明白你的观点,用大写字母等。;我总是用小写字母和标点符号来清理所有的预处理,但在问题中没有说清楚。。。我将阅读
Collator
,这似乎是我需要的&我不知道的。如果您处理的是自然语言字符串,我建议您阅读更多关于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