Groovy - Làm thế nào để so sánh chuỗi?


82

cách so sánh chuỗi được truyền dưới dạng tham số

phương pháp sau đây không hoạt động.

 String str = "saveMe"

 compareString(str)

 def compareString(String str){
    def str2 = "saveMe"
    if(str2==${str}){
      println "same"
    }else{
      println "not same"
    }
 }    

cũng đã thử

 String str = "India"

 compareString(str)

 def compareString(String str){
   def str2 = "india"
   if( str2 == str ) {
     println "same"
   }else{
     println "not same"
   }
 }    

20
Indiakhông giống như india. Ký tự đầu tiên là khác nhau
tim_yates

Câu trả lời:


86

Đường thẳng này:

if(str2==${str}){

Nên là:

if( str2 == str ) {

Các ${}sẽ cung cấp cho bạn một lỗi phân tích cú pháp, vì chúng chỉ nên được sử dụng bên trong Groovy Strings cho khuôn mẫu


@ user1602802 Nó hoạt động trong bảng điều khiển thú vị. Bạn đang gặp phải lỗi gì?
tim_yates

25
@ user1602802 Bạn có đang so sánh Indiavới viết hoa Ivà viết indiathường inhư trong phần chỉnh sửa cho câu hỏi của mình không? India != india. Họ khác nhau.
tim_yates

117

Đây phải là một câu trả lời

str2.equals (str)

Nếu bạn muốn bỏ qua trường hợp

str2.equalsIgnoreCase (str)


17
Từ chối vì câu hỏi ban đầu không chỉ rõ rằng nó nên bỏ qua sự cẩn thận. Ngoài ra, groovy hỗ trợ ==toán tử để so sánh chuỗi (ngược lại với Java, nơi ==so sánh danh tính, không so sánh chuỗi).
brianmearns

Tôi điều chỉnh câu trả lời là trường hợp nhạy cảm
ojblass

1
Có bí danh ngắn gọn cho equalsIgnoreCase trong Groovy không?
Simon Logic

1
Tôi nghĩ bạn có thể tạo một hàm wrapper gọi là eIC hoặc một cái gì đó tương tự. Phụ thuộc vào mức độ nó thực sự gây lỗi cho bạn.
ojblass

4
Cảnh báo. .equals()không không cư xử như nhau trong Groovy giống như trong Java. Ví dụ ở đây - cuộn xuống 'GString and String'. Về cơ bản, cả hai mục phải thuộc cùng một loại lớp Chuỗi. Vì lớp String là ẩn trong phép gán - GString là một cấu trúc ngôn ngữ Groovy và String là một định nghĩa nội tuyến, một cái gì đó giống như def foo = "foo"... "${foo}".equals("foo")sẽ trả về false.
ingyhere

6

Nếu bạn không muốn kiểm tra chữ hoa hoặc chữ thường, bạn có thể sử dụng phương pháp sau.

String str = "India" 
compareString(str) 

def compareString(String str){ 
  def str2 = "india" 
  if( str2.toUpperCase() == str.toUpperCase() ) { 
    println "same" 
  }else{ 
    println "not same" 
  } 
}

Vì vậy, bây giờ nếu bạn thay đổi str thành "iNdIa", nó sẽ vẫn hoạt động, vì vậy bạn giảm khả năng mắc lỗi chính tả.


42
str2.equalsIgnoreCase( str )có lẽ là dễ dàng hơn để đọc :-)
tim_yates

1
@tim_yates không chỉ dễ đọc hơn mà còn đúng hơn. Các chuyển đổi trường hợp như thế này dễ bị lỗi ngôn ngữ (Tiếng Thổ Nhĩ Kỳ I, v.v.).
Ohad Schneider

1

Cách ngắn nhất (sẽ in "không giống nhau" vì so sánh chuỗi phân biệt chữ hoa chữ thường):

def compareString = {
   it == "india" ? "same" : "not same"
}    

compareString("India")

-3

Ở Groovy, null == nullnhận được một true. Trong thời gian chạy, bạn sẽ không biết chuyện gì đã xảy ra. Trong Java, ==là so sánh hai tham chiếu.

Đây là một nguyên nhân gây ra sự nhầm lẫn lớn trong lập trình cơ bản, Liệu nó có an toàn để sử dụng bằng. Trong thời gian chạy, null.equals sẽ đưa ra một ngoại lệ. Bạn có cơ hội để biết điều gì đã xảy ra.

Đặc biệt, bạn nhận được hai giá trị từ các khóa không tồn tại trong (các) bản đồ, ==làm cho chúng bằng nhau.


-7

sử dụng biến def, khi bạn muốn so sánh bất kỳ Chuỗi nào. Sử dụng mã dưới đây cho kiểu so sánh đó.

tên biến def = null

Truy vấn SQL cung cấp cho bạn một số lợi nhuận. Sử dụng hàm với kiểu trả về là def.

def functionname (tên biến def) {

trả về tên biến

}

if ("$ tên biến" == "true") {

}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.