Groovy - 如何比较字符串?

109

如何比较传递作为参数的字符串

以下方法不起作用。

 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"
   }
 }    

26
“India”不同于“india”,它们的首字母不同。 - tim_yates
7个回答

150

这是答案:

str2.equals( str )

如果您想忽略大小写:

str2.equalsIgnoreCase( str )


41
因为原问题没有指定不考虑大小写,所以进行了负分评价。此外,Groovy支持使用==运算符进行字符串比较(与Java不同,Java中==用于比较对象的引用,而非字符串内容)。 - brianmearns
1
我将答案调整为区分大小写。 - ojblass
1
在Groovy中是否有equalsIgnoreCase的简短别名? - Simon Logic
1
我认为你可以创建一个名为eIC或类似名称的包装函数,这取决于它实际上有多烦人。 - ojblass
11
警告:在Groovy中,.equals()与Java中的行为不同。示例在这里(http://grails.asia/groovy-compare-string) - 向下滚动到'GString and String'。基本上,两个项目都必须是相同类型的String类。由于String类在赋值中是隐式的 - GString是Groovy语言构造,而String是内联定义,因此类似于 def foo = "foo" ... "${foo}".equals("foo") 将返回 false - ingyhere

116

这一行:

if(str2==${str}){

应该是:

if( str2 == str ) {

${}会导致解析错误,因为它们应该只在Groovy字符串中用于模板化。


@user1602802 在Groovy控制台中是可以的。 您遇到了什么错误? - tim_yates
26
你是在将大写的 "India" 和小写的 "india" 进行比较吗?它们是不同的,大写和小写不同。 - tim_yates
7
如果你熟悉Java,那么这可能看起来不对,但在Groovy中==运算符像equals一样进行字符串比较。 - Federico Nafria

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”,它仍然有效,因此您降低了出现拼写错误的机会。


46
str2.equalsIgnoreCase(str) 可能更易读 :-) - tim_yates
2
@tim_yates,这不仅更易于阅读,而且更加正确。此类大小写转换容易出现区域设置错误(如土耳其语等)。 - Ohad Schneider

0

最短的方式(将打印“not same”,因为字符串比较是区分大小写的):

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会抛出异常。你有机会知道出了什么问题。
特别是当你从不存在于map中的键获取两个值时,==会使它们相等。

-7

当您想要比较任何字符串时,请使用 def 变量。可以使用以下代码进行此类比较。

def 变量名称 = null

SQL 查询会返回一些内容。可以使用带有 def 返回类型的函数。

def 函数名(def 变量名称){

return 变量名称

}

如果("$变量名称" == "true"){

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接