如何在Groovy中更简洁地忽略X字符比较两个字符串?
简化Groovy字符串对比(忽略X字符)的实现
我有两个字符串:01xx01xx01 和 0101010111,希望仅对比其中非X的字符(例如提取出010101和010111进行对比)。自己编写了一段Groovy脚本可以正常运行,但代码行数较多,想找更简洁的实现方式。
原脚本代码:
a="01xx01xx01" b="0101010111" def compareStrings(String a,String b){ i=0 while (i<a.length){ if (a[i] =="X" || b[i]=="X"){ i+=1} else if (a[i]!=b[i]){ return "Not Similar"} else{ i+=1} return "Similar" } } def result = compareStrings(str1,str2) println(result)
几种简洁实现方式
方法一:过滤后直接对比
利用Groovy的findAll方法过滤掉两个字符串中的X字符,再直接对比过滤后的结果,逻辑直观简洁:
def a = "01xx01xx01" def b = "0101010111" def compareStrings(String s1, String s2) { def filteredS1 = s1.findAll { it != 'X' } def filteredS2 = s2.findAll { it != 'X' } filteredS1 == filteredS2 ? "Similar" : "Not Similar" } println(compareStrings(a, b))
方法二:遍历过程中提前终止
如果追求更高效率(遇到不匹配就立刻返回,无需处理剩余字符),可以用eachWithIndex遍历,一旦发现非X字符不匹配就返回结果:
def a = "01xx01xx01" def b = "0101010111" def compareStrings(String s1, String s2) { s1.eachWithIndex { char c1, int idx -> def c2 = s2[idx] if (c1 != 'X' && c2 != 'X' && c1 != c2) { return "Not Similar" } } "Similar" } println(compareStrings(a, b))
内容的提问来源于stack exchange,提问作者Liu Xu
相关产品推荐
相关产品推荐

