Groovy - Як порівняти рядок?


85

як порівняти рядок, який передається як параметр

наступний метод не працює.

 String str = "saveMe"

 compareString(str)

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

також намагався

 String str = "India"

 compareString(str)

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

21
Indiaне те саме, що india. Перший персонаж інший
tim_yates

Відповіді:


88

Цей рядок:

if(str2==${str}){

Має бути:

if( str2 == str ) {

${І }дасть вам помилку синтаксичного аналізу, так як вони повинні бути використані тільки в Groovy Струни для шаблонами


@ user1602802 Це робиться в груві консолі. Які помилки ви отримуєте?
tim_yates

25
@ user1602802 Чи порівнюєте ви Indiaз великими Iта indiaмалими літерами, iяк у редагуванні вашого запитання? India != india. Вони різні.
tim_yates

118

Це має бути відповіддю

str2.equals (str)

Якщо ви хочете проігнорувати справу

str2.equalsIgnoreCase (str)


18
Проголосування проти, оскільки вихідне запитання не вказувало, що воно повинно ігнорувати догляд. Крім того, groovy підтримує ==оператор для порівняння рядків (на відміну від Java, де ==це порівняння ідентичності, а не порівняння рядків).
brianmearns

Я скоригував відповідь з урахуванням регістру
ojblass

1
Чи існує короткий псевдонім для equalsIgnoreCase у Groovy?
Саймон Логік

1
Я думаю, ви можете створити функцію обгортки, яка називається eIC або щось подібне. Залежить від того, наскільки це насправді вас хвилює.
ojblass

4
Увага. .equals()зовсім НЕ поводяться так само в Groovy , як це робиться в Java. Приклад тут - прокрутіть вниз до 'GString and String'. В основному обидва елементи повинні бути одного типу класу String. Оскільки клас String є неявним у призначенні - GString є конструкцією мови Groovy, а String - вбудованим визначенням, щось на зразок def foo = "foo"... "${foo}".equals("foo")повернеться false.
ingyhere

6

Якщо ви не хочете перевіряти верхню чи нижню регістри, ви можете скористатися наступним методом.

String str = "India" 
compareString(str) 

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

Отже, якщо ви зміните str на "iNdIa", він все одно буде працювати, тож ви зменшуєте шанс зробити помилку.


42
str2.equalsIgnoreCase( str )це, мабуть, легше читати :-)
tim_yates

1
@tim_yates не тільки легше читати, але і правильніше. Такі конверсії випадків схильні до локальних помилок (турецька мова тощо).
Охад Шнайдер

1

Найкоротший шлях (надрукує "не те саме", оскільки порівняння рядків чутливе до регістру):

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
} 

вихід:

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 null == nullотримує true. Під час виконання ви не будете знати, що сталося. У Java ==проводиться порівняння двох посилань.

Це є причиною великої плутанини в базовому програмуванні, чи безпечно використовувати рівне. Під час виконання null.equals дасть виняток. У вас є шанс дізнатися, що пішло не так.

Зокрема, ви отримуєте два значення з ключів, які не існують на карті (картах), ==робить їх рівними.


-7

використовуйте змінну def, коли ви хочете порівняти будь-який рядок. Використовуйте код нижче для цього типу порівняння.

def ім'я змінної = нуль

Запит SQL дасть вам деяку віддачу. Використовуйте функцію з типом повернення def.

def functionname (def ім'я змінної) {

повернути ім'я змінної

}

if ("$ ім'я змінної" == "true") {

}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.