Groovy - Dize nasıl karşılaştırılır?


85

parametre olarak iletilen dizge nasıl karşılaştırılır

aşağıdaki yöntem çalışmıyor.

 String str = "saveMe"

 compareString(str)

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

ayrıca denedi

 String str = "India"

 compareString(str)

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

21
Indiaile aynı değil india. İlk karakter farklı
tim_yates

Yanıtlar:


88

Bu hat:

if(str2==${str}){

Olmalı:

if( str2 == str ) {

${Ve }onlar sadece şablonu için Groovy Strings içeride kullanılması gerektiğini gibi size ayrıştırma hatası verecektir


@ user1602802 Harika konsolda yapar. Ne tür hatalar alıyorsun?
tim_yates

25
@ user1602802 Eğer karşılaştırıyorsunuz Indiabir sermaye ile Ive indiabir küçük harf ile isorunuza düzenlemek gibi? India != india. Onlar farklı.
tim_yates

118

Bu bir cevap olmalı

str2.equals (str)

Vakayı görmezden gelmek istiyorsanız

str2.equalsIgnoreCase (str)


18
Asıl soru, özeni görmezden gelmesi gerektiğini belirtmediği için olumsuz oylama. Ayrıca groovy, ==dizge karşılaştırması için operatörü destekler (Java'nın aksine ==, dizge karşılaştırması değil kimlik karşılaştırması yapar).
brianmearns

Yanıtı büyük / küçük harfe duyarlı olacak şekilde ayarladım
ojblass

1
Groovy'de equalsIgnoreCase için kısa bir takma ad var mı?
Simon Logic

1
EIC veya benzeri adında bir sarmalayıcı işlevi oluşturabileceğinizi düşünüyorum. Seni ne kadar rahatsız ettiğine bağlı.
ojblass

4
Uyarı. .equals()yok değil o Java yaptığı gibi Groovy aynı davranırlar. Örnek burada - 'GString and String'e gidin. Temel olarak her iki öğe de aynı tip String sınıfından olmalıdır. String sınıfı atamasında örtülü olduğu için - gstring bir Groovy dil oluşumudur ve String, gibi bir şey bir satır içi tanımıdır def foo = "foo"... "${foo}".equals("foo")dönecektir false.
ingyhere

6

Büyük veya küçük harfleri kontrol etmek istemiyorsanız, aşağıdaki yöntemi kullanabilirsiniz.

String str = "India" 
compareString(str) 

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

Şimdi, str'yi "iNdIa" olarak değiştirirseniz, yine de çalışacaktır, böylece bir yazım hatası yapma şansınızı düşürürsünüz.


42
str2.equalsIgnoreCase( str )muhtemelen okumak daha kolay :-)
tim_yates

1
@tim_yates sadece okunması kolay değil, aynı zamanda daha doğru. Bunlar gibi vaka dönüşümleri yerel ayar hatalarına eğilimlidir (Türkçe I vb.).
Ohad Schneider

1

En kısa yol (Dize karşılaştırması büyük / küçük harfe duyarlı olduğundan "aynı değil" yazdırılır):

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

compareString("India")

0
String str = "saveMe"
compareString(str)

def compareString(String str){
  def str2 = "saveMe"

  // using single quotes
  println 'single quote string class' + 'String.class'.class
  println str + ' == ' + str2 + " ? " + (str == str2)
  println ' str = ' +  '$str' //  interpolation not supported

  // using double quotes, Interpolation supported
  println "double quoted string with interpolation " + "GString.class $str".class
  println "double quoted string without interpolation " + "String.class".class
  println "$str equals $str2 ? " + str.equals(str2) 
  println '$str == $str2 ? ' + "$str==$str2"
  println '${str == str2} ? ' + "${str==str2} ? "

  println '$str equalsIgnoreCase $str2 ? ' + str.equalsIgnoreCase(str2)   

  println '''
  triple single quoted Multi-line string, Interpolation not supported $str ${str2}
  Groovy has also an operator === that can be used for objects equality
  === is equivalent to o1.is(o2)
  '''
  println '''
  triple quoted string 
  '''
  println 'triple single quoted string ' + '''' string '''.class

  println """ 
  triple double quoted Multi-line string, Interpolation is supported $str == ${str2}
  just like double quoted strings with the addition that they are multiline
  '\${str == str2} ? ' ${str == str2} 
  """
  println 'triple double quoted string ' + """ string """.class
} 

çıktı:

single quote string classclass java.lang.String
saveMe == saveMe ? true
str = $str
double quoted string with interpolation class org.codehaus.groovy.runtime.GStringImpl
double quoted string without interpolation class java.lang.String
saveMe equals saveMe ? true
$str == $str2 ? saveMe==saveMe
${str == str2} ? true ? 
$str equalsIgnoreCase $str2 ? true 

triple single quoted Multi-line string, Interpolation not supported $str ${str2}
Groovy has also an operator === that can be used for objects equality
=== is equivalent to o1.is(o2)


triple quoted string 

triple single quoted string class java.lang.String

triple double quoted Multi-line string, Interpolation is supported saveMe == saveMe
just like double quoted strings with the addition that they are multiline
'${str == str2} ? ' true 

triple double quoted string class java.lang.String

-3

Groovy'de null == nullbir true. Çalışma zamanında ne olduğunu bilemezsiniz. Java'da ==iki referans karşılaştırılıyor.

Bu, eşittir kullanımının güvenli olup olmadığı, temel programlamada büyük bir kafa karışıklığının nedenidir. Çalışma zamanında, null.equals bir istisna verecektir. Neyin yanlış gittiğini bilmek için bir şansın var.

Özellikle harita (lar) da olmayan anahtarlardan iki değer elde edersiniz ==, onları eşit yapar.


-7

Herhangi bir String'i karşılaştırmak istediğinizde def değişkenini kullanın. Bu tür bir karşılaştırma için aşağıdaki kodu kullanın.

def değişken adı = boş

SQL sorgusu size biraz geri dönüş sağlar. İşlevi, dönüş türü def ile kullanın.

def functionname (def variablename) {

dönüş değişken adı

}

if ("$ değişken adı" == "doğru") {

}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.