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


1
Есть ли короткий псевдоним для equalsIgnoreCase в Groovy?
Simon Logic

1
Я думаю, вы могли бы создать функцию-оболочку под названием eIC или что-то подобное. Зависит от того, насколько вас это действительно беспокоит.
ojblass

4
Предупреждение. .equals()вовсе не ведут себя так же в Groovy , как это делается в Java. Пример здесь - прокрутите вниз до «GString and String». По сути, оба элемента должны быть одного типа класса String. Так как класс строк подразумевается в задании - GString конструкция языка Groovy и строка является определение рядный, что - то вроде 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 не только легче читать, но и более корректно. Подобные преобразования регистра подвержены ошибкам языкового стандарта (турецкий язык I и т. Д.).
Охад Шнайдер

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== сравниваются две ссылки.

Это причина большой путаницы в базовом программировании, безопасно ли использовать equals. Во время выполнения null.equals выдаст исключение. У вас есть шанс узнать, что пошло не так.

В частности, вы получаете два значения из ключей, которых нет на карте (ах), что ==делает их равными.


-7

используйте переменную def, когда вы хотите сравнить любую строку. Используйте приведенный ниже код для этого типа сравнения.

def имя переменной = null

SQL-запрос даст вам некоторую отдачу. Используйте функцию с возвращаемым типом def.

def functionname (def имя переменной) {

вернуть имя переменной

}

if ("$ имя переменной" == "истина") {

}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.