Groovy - Wie vergleiche ich die Saite?

84

Vergleichen der Zeichenfolge, die als Parameter übergeben wird

Die folgende Methode funktioniert nicht.

 String str = "saveMe"

 compareString(str)

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

auch versucht

 String str = "India"

 compareString(str)

 def compareString(String str){
   def str2 = "india"
   if( str2 == str ) {
     println "same"
   }else{
     println "not same"
   }
 }    
user1602802
quelle
21
Indiaist nicht dasselbe wie india. Das erste Zeichen ist anders
tim_yates

Antworten:

88

Diese Linie:

if(str2==${str}){

Sollte sein:

if( str2 == str ) {

Das ${und }gibt Ihnen einen Analysefehler, da sie nur in Groovy Strings für Vorlagen verwendet werden sollten

tim_yates
quelle
@ user1602802 Das tut es in der groovigen Konsole. Welche Fehler bekommen Sie?
tim_yates
25
@ user1602802 Vergleichen Sie Ihre Frage Indiamit einem Großbuchstaben Iund indiaeinem Kleinbuchstaben iwie in der Bearbeitung? India != india. Sie sind anders.
tim_yates
118

Dies sollte eine Antwort sein

str2.equals (str)

Wenn Sie den Fall ignorieren möchten

str2.equalsIgnoreCase (str)

ojblass
quelle
17
Downvoting, da in der ursprünglichen Frage nicht angegeben wurde, dass die Sorgfalt ignoriert werden soll. Außerdem unterstützt groovy den ==Operator für den Zeichenfolgenvergleich (im Gegensatz zu Java, wo ==der Identitätsvergleich und nicht der Zeichenfolgenvergleich durchgeführt wird).
Brianmearns
Ich habe die Antwort so angepasst, dass zwischen Groß- und Kleinschreibung unterschieden wird
ojblass
1
Gibt es einen kurzen Alias ​​für equalsIgnoreCase in Groovy?
Simon Logic
1
Ich denke, Sie könnten eine Wrapper-Funktion namens eIC oder ähnliches erstellen. Kommt darauf an, wie sehr es dich tatsächlich nervt.
Ojblass
4
Warnung. .equals()tut nicht das gleiche in Groovy verhalten , wie es in Java tut. Beispiel hier - scrollen Sie nach unten zu 'GString and String'. Grundsätzlich müssen beide Elemente vom gleichen Typ einer String-Klasse sein. Da die String-Klasse in der Zuweisung impliziert ist - GString ist ein Groovy-Sprachkonstrukt und String eine Inline-Definition, wird so etwas wie def foo = "foo"... "${foo}".equals("foo")zurückgegeben false.
Ingyhere
6

Wenn Sie keine Groß- oder Kleinschreibung überprüfen möchten, können Sie die folgende Methode verwenden.

String str = "India" 
compareString(str) 

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

Wenn Sie also str in "iNdIa" ändern, funktioniert es immer noch, sodass Sie die Wahrscheinlichkeit verringern, dass Sie einen Tippfehler machen.

Dieterg
quelle
42
str2.equalsIgnoreCase( str )ist wahrscheinlich leichter zu lesen :-)
tim_yates
1
@tim_yates ist nicht nur einfacher zu lesen, sondern auch korrekter. Fallkonvertierungen wie diese sind anfällig für Gebietsschemafehler (Türkisch I usw.).
Ohad Schneider
1

Der kürzeste Weg (wird "nicht gleich" gedruckt, da beim String-Vergleich zwischen Groß- und Kleinschreibung unterschieden wird):

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

compareString("India")
Simek
quelle
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
} 

Ausgabe:

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
Geschwindigkeit
quelle
-3

In Groovy null == nullbekommt ein true. Zur Laufzeit wissen Sie nicht, was passiert ist. In Java== zwei Referenzen verglichen.

Dies ist eine Ursache für große Verwirrung in der Grundprogrammierung, ob es sicher ist, gleich zu verwenden. Zur Laufzeit gibt null.equals eine Ausnahme aus. Sie haben die Möglichkeit zu wissen, was schief gelaufen ist.

Insbesondere erhalten Sie zwei Werte von Schlüsseln, die in Map (s) nicht vorhanden sind, ==wodurch sie gleich sind.

user4313287
quelle
-7

Verwenden Sie die Variable def, wenn Sie einen String vergleichen möchten. Verwenden Sie den folgenden Code für diese Art von Vergleich.

def Variablenname = null

SQL-Abfrage geben Ihnen eine gewisse Rendite. Verwenden Sie die Funktion mit dem Rückgabetyp def.

def Funktionsname (def Variablenname) {

Variablenname zurückgeben

}}

if ("$ variable name" == "true") {

}}

Deepanshu Jain
quelle