2014-10-10 50 views
9

我想比较scala中的两个字符串。例如,如何比较scala中的两个字符串?

我的字符串是:

scala java 
scala java c++ 
scala c++ 

我想比较字符串

阶C++” 每串

结果应该是,

scala c++ = scala java // false 
scala c++ = scala java c++ // false 
scala c++ = scala c++ // true 
+2

什么将是返回true的例子吗? – 2014-10-10 10:46:36

+2

为什么最后的测试应该返回'false'? – 2014-10-10 11:07:03

回答

21

在斯卡拉你可以使用== for equality

scala> "scala c++" == "scala java" 
res0: Boolean = false 
scala> "scala c++" == "scala java c++" 
res1: Boolean = false 
scala> "scala c++" == "scala c++" 
res2: Boolean = true 

==方法在AnyRef类中定义。由于这些方法首先检查空值,然后在第一个对象上调用equals方法来查看这两个对象是否相等,您不必进行特殊的空检查;

"test" == null 
res0: Boolean = false 

Scala getting started guidestrings

从 “An Overview of the Scala Programming Language Second Edition”;

“的平等操作值之间==被设计为 透明相对于该类型的表示。对于值 类型,它是天然的(数值或布尔)相等。为了参考 类型==被视为的别名等于从 java.lang.Object中方法。该方法最初定义为参考 平等,但是指在子类中实现01被覆盖这些小类的平等自然概念。例如,值类型的盒装版本将实现等于方法 比较盒装值。相比之下,在Java中,==始终意味着 引用类型上的引用相等。虽然这是更有效的实施,但它也引入了严重的一致性问题 ,因为相同值的盒装版本可能不再等于关于==的 。有些情况下需要参考平等而不是用户自定义的平等。一个例子是散列问题,其中最大的问题是 。对于这些情况,类AnyRef定义了一个附加当量 方法,该方法不能被重写,并且被实现为参照 平等(即,它的行为就像 ==在Java中作为参考类型)。”

+0

这个单一的改进带走了这么多'java'痛苦! – dmitry 2015-08-04 09:40:40

0

与Java,Scala的使用完全不可改变的字符串。 随着奥柳斯指出,

字符串在Java和Scala不变。Scala使用Java字符串,但 用StringOps或WrappedString包装它们。 Java中的“final”是 ,与Scala中的“val”基本相同。在Scala中,==方法是在AnyRef中定义的 。

所以,在斯卡拉你只需使用==运算符来比较两个字符串。

例如你有串STRING1和字符串2你可以做

string1 == string2 //=> true/false 

什么你可能要记住的是,如果该字符串值不存储在val,你只是想比较二,你应该使用双引号来封装字符串值。

例如:

"hello" == "hello" //=> true 
"hello" == "bye" //=> false 
+3

字符串在Java和Scala中是不可变的。 Scala使用Java字符串,但是用StringOps或WrappedString封装它们。 Java中的“final”与Scala中的“val”基本相同。 在Scala中,==方法在AnyRef中定义。 – oluies 2014-10-13 10:19:21

+0

@奥利斯,对。感谢您指出了这一点。我会更新答案。 – 2014-10-13 14:24:02

+0

“**与Java **不同,Scala使用完全不可变的字符串”是什么意思? Java中的字符串也是不可变的。 – MondKin 2017-08-18 04:26:49