2014-10-10 16 views
9

Tôi muốn so sánh hai chuỗi trong scala. ví dụ,Làm thế nào để so sánh hai chuỗi trong scala?

Strings của tôi là:

scala java 
scala java c++ 
scala c++ 

tôi muốn so sánh chuỗi

"scala C++" với mỗi chuỗi

Kết quả nên được,

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

Và những gì sẽ là một ví dụ mà trả về true? –

+2

Tại sao phép thử cuối cùng phải trả về 'false'? –

Trả lời

21

Trong Scala bạn có thể sử dụng == cho sự bình đẳng

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 

Phương thức == được định nghĩa trong lớp AnyRef. Vì các phương thức đầu tiên kiểm tra các giá trị null, và sau đó gọi phương thức equals trên đối tượng đầu tiên để xem hai đối tượng có bằng không, bạn không phải thực hiện kiểm tra null đặc biệt;

"test" == null 
res0: Boolean = false 

Xem Scala getting started guidestrings

Từ "An Overview of the Scala Programming Language Second Edition";

"Các hoạt động bình đẳng == giữa các giá trị được thiết kế để minh bạch đối với các đại diện của loại với. Đối với giá trị loại, nó là tự nhiên (số hoặc boolean) bình đẳng. Để tham khảo loại, == được coi là một bí danh của bằng phương pháp từ java.lang.Object. Đó là phương pháp ban đầu được xác định là tài liệu tham khảo bình đẳng, nhưng có nghĩa là để được ghi đè trong các lớp con để thực hiện khái niệm tự nhiên về bình đẳng đối với các phân lớp này. Ví dụ: các phiên bản loại giá trị được đóng hộp sẽ thực hiện phương thức bằng so sánh giá trị được đóng hộp. Ngược lại, trong Java, == luôn có nghĩa là bình đẳng tham chiếu trên các loại tham chiếu. Trong khi điều này có hiệu quả hơn một chút để thực hiện, nó cũng giới thiệu một vấn đề chặt chẽ nghiêm trọng vì các phiên bản đóng hộp có giá trị bằng nhau có thể không còn bằng liên quan đến ==. Một số trường hợp yêu cầu sự bình đẳng tham chiếu thay vì bình đẳng do người dùng sử dụng. Ví dụ là tính năng băm băm, trong đó hiệu quả là tối quan trọng. Đối với những trường hợp này, lớp AnyRef định nghĩa thêm một phương pháp eq , mà không thể được ghi đè, và được thực hiện như tài liệu tham khảo bình đẳng (tức là, nó hoạt động như == trong Java với nhiều loại tài liệu tham khảo)."

+0

Sự tinh tế duy nhất này lấy đi rất nhiều nỗi đau 'java'! – dmitry

0

Không giống như Java, Scala sử dụng các chuỗi một cách hoàn hảo không thay đổi. Như Olius chỉ ra,

Strings là không thay đổi trong Java và Scala.Scala sử dụng các chuỗi Java, nhưng kết thúc chúng với StringOps hoặc WrappedString. "cuối cùng" trong Java là về cơ bản giống như "val" trong Scala. Trong Scala, phương thức == là được định nghĩa trong AnyRef.

Vì vậy, trong Scala bạn sẽ chỉ sử dụng toán tử == để so sánh hai chuỗi.

Ví dụ bạn phải hai xâu string1 và chuỗi 2 bạn chỉ có thể làm

string1 == string2 //=> true/false 

Những gì bạn có thể muốn ghi nhớ là nếu giá trị chuỗi không được lưu trữ trong một val và bạn chỉ muốn so sánh hai, bạn nên sử dụng dấu ngoặc kép để đóng gói các giá trị chuỗi.

Ví dụ:

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

Chuỗi không thay đổi trong Java và Scala. Scala sử dụng các chuỗi Java, nhưng kết thúc chúng bằng StringOps hoặc WrappedString. "cuối cùng" trong Java về cơ bản giống như "val" trong Scala. Trong Scala, phương thức == được định nghĩa trong AnyRef. – oluies

+0

@Oluies, phải. Cảm ơn bạn đã chỉ ra điều đó. Tôi sẽ cập nhật câu trả lời. –

+0

Bạn có ý nghĩa gì bởi "** Không giống Java **, Scala sử dụng các chuỗi hoàn toàn bất biến"? Các chuỗi trong Java cũng không thay đổi. – MondKin

Các vấn đề liên quan