Groovy - Jak porównać ciąg?

85

jak porównać ciąg, który jest przekazywany jako parametr

Następująca metoda nie działa.

 String str = "saveMe"

 compareString(str)

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

też próbowałem

 String str = "India"

 compareString(str)

 def compareString(String str){
   def str2 = "india"
   if( str2 == str ) {
     println "same"
   }else{
     println "not same"
   }
 }    
user1602802
źródło
21
Indiato nie to samo co india. Pierwsza postać jest inna
tim_yates

Odpowiedzi:

88

Ta linia:

if(str2==${str}){

Powinien być:

if( str2 == str ) {

Polecenie ${i }spowoduje błąd analizy, ponieważ powinny być używane tylko w Groovy Strings do tworzenia szablonów

tim_yates
źródło
@ user1602802 Robi to w groovy konsoli. Jakie błędy otrzymujesz?
tim_yates,
25
@ user1602802 Czy porównujesz Indiaz wielką Ii indiamałą literą, ijak w edycji twojego pytania? India != india. Oni są różni.
tim_yates,
118

To powinna być odpowiedź

str2.equals (str)

Jeśli chcesz zignorować wielkość liter

str2.equalsIgnoreCase (str)

ojblass
źródło
18
Głosowanie w dół, ponieważ pierwotne pytanie nie określało, że powinno ignorować troskę. Ponadto groovy obsługuje ==operatora do porównywania ciągów (w przeciwieństwie do Javy, gdzie ==porównuje się tożsamość, a nie porównywanie ciągów).
brianmearns
Dostosowałem odpowiedź tak, aby uwzględniała wielkość liter
ojblass,
1
Czy istnieje krótki alias dla equalsIgnoreCase w Groovy?
Simon Logic
1
Myślę, że możesz stworzyć funkcję opakowującą o nazwie eIC lub coś podobnego. Zależy od tego, jak bardzo cię to wkurza.
ojblass
4
Ostrzeżenie. .equals()czy nie zachowują się tak samo w Groovy jak ma to miejsce w Javie. Przykład tutaj - przewiń w dół do „GString and String”. Zasadniczo oba elementy muszą być tego samego typu klasy String. Ponieważ klasa String jest niejawna w przypisaniu - GString jest konstrukcją języka Groovy, a String jest definicją wbudowaną, coś takiego jak def foo = "foo"... "${foo}".equals("foo")zwróci false.
ingyhere
6

Jeśli nie chcesz sprawdzać wielkich lub małych liter, możesz użyć następującej metody.

String str = "India" 
compareString(str) 

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

Więc teraz, jeśli zmienisz str na „iNdIa”, to nadal będzie działać, więc zmniejszasz szansę, że popełnisz literówkę.

Dieterg
źródło
42
str2.equalsIgnoreCase( str )jest prawdopodobnie łatwiejszy do odczytania :-)
tim_yates
1
@tim_yates jest nie tylko łatwiejszy do odczytania, ale także bardziej poprawny. Takie konwersje przypadków są podatne na błędy regionalne (turecki I itp.).
Ohad Schneider
1

Najkrótszy sposób (wypisze „nie to samo”, ponieważ porównanie ciągów znaków uwzględnia wielkość liter):

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

compareString("India")
Simek
źródło
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
} 

wynik:

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
prędkość
źródło
-3

W Groovy null == nulldostaje true. W czasie wykonywania nie wiesz, co się stało. W Javie== porównuje dwa odwołania.

Jest to przyczyną dużego zamieszania w podstawowym programowaniu, czy używanie równa się jest bezpieczne. W czasie wykonywania a null.equals będzie stanowić wyjątek. Masz szansę dowiedzieć się, co poszło nie tak.

W szczególności otrzymujesz dwie wartości z kluczy, których nie ma w mapach, co ==sprawia , że są równe.

user4313287
źródło
-7

użyj zmiennej def, jeśli chcesz porównać dowolny łańcuch. Użyj poniższego kodu dla tego typu porównania.

def nazwa zmiennej = null

Zapytanie SQL daje zwrot. Użyj funkcji z typem powrotu def.

def functionname (def zmienna nazwa) {

nazwa zmiennej zwracanej

}

if ("$ nazwa zmiennej" == "prawda") {

}

Deepanshu Jain
źródło