如何制作一个比较字符串的函数?
Posted
技术标签:
【中文标题】如何制作一个比较字符串的函数?【英文标题】:How to make a function that compares strings? 【发布时间】:2015-06-02 11:12:03 【问题描述】:我想做一个比较字符串的函数。 我不想使用相等运算符 (==),我希望它只适用于 Swift 语言。
首先我做了一个函数,它接受 2 个字符串,并返回 bool 类型。 然后我用 for in 语法循环了这些字符串。 并且想要比较这些字符,如果字符串具有相等的值,它应该返回true,如果不是,则返回false。有没有更好的办法?
func isEqual(str1:String, str2:String) -> Bool
var result = false
for char in str1
for char2 in str2
//Compare characters.
return result
【问题讨论】:
你为什么不想使用==
?
“我希望它只适用于 Swift 语言”是什么意思?
@ABakerSmith 因为我正在练习...
@Martin R 我的意思是我不想使用诸如“NSComparisonResult”之类的东西。我只想使用快速的基本语法..
【参考方案1】:
==
在 Swift 中可以很好地处理字符串。出于教育目的
(正如我从您的评论中得出的结论“因为我正在练习......”)
您可以将其实现为:
func myStringCompare(str1 : String, str2 : String) -> Bool
if count(str1) != count(str2)
return false
for (c1, c2) in zip(str1, str2)
if c1 != c2
return false
return true
zip(str1, str2)
返回给定的对序列
序列,这是枚举字符串的便捷方式
“并行”。
一旦你了解了它的工作原理,你就可以缩短它, 例如:
func myStringCompare(str1 : String, str2 : String) -> Bool
return count(str1) == count(str2) && !contains(zip(str1, str2), $0 != $1 )
比较字符串长度是必要的,因为zip()
序列
只要其中一个字符串用完就终止。看一下
@drewag 对 In Swift I would like to "join" two sequences in to a sequence of tuples 的回答
寻找替代的Zip2WithNilPadding
序列。
如果您不想使用内置的zip()
功能(再次为
教育/自学目的!)然后你可以使用这个事实
字符串是序列,并使用并行枚举它们
序列生成器。这不仅适用于字符串,而且适用于
对于任意序列,只要底层元素可以
进行相等性测试,所以让我们将其设为 generic 函数:
func mySequenceCompare<S : SequenceType where S.Generator.Element : Equatable>(lseq : S, rseq : S) -> Bool
var lgen = lseq.generate()
var rgen = rseq.generate()
// First elements (or `nil`):
var lnext = lgen.next()
var rnext = rgen.next()
while let lelem = lnext, relem = rnext
if lelem != relem
return false
// Next elements (or `nil`):
lnext = lgen.next()
rnext = rgen.next()
// Are both sequences exhausted?
return lnext == nil && rnext == nil
测试:
mySequenceCompare("xa", "xb") // false
mySequenceCompare("xa", "xa") // true
mySequenceCompare("a", "aa") // false
mySequenceCompare("aa", "a") // false
【讨论】:
感谢 Martin 的精彩课程!它真的帮助我快速理解。我还尝试将这些字符放入一个新数组并比较数组中的每个项目。 :) 谢谢。【参考方案2】:我的解决方案略有不同,因为我不了解 zip 运算符,我想它不如 Martin 的一篇文章那么有效。
很好的问题阿尔方斯
func isEqual(str1:String, str2:String) -> Bool
if count(str1) != count(str2)
return false
for var i = 0; i < count(str1); ++i
let idx1 = advance(str1.startIndex,i)
let idx2 = advance(str2.startIndex,i)
if str1[idx1] != str2[idx2]
return false
return true
正如 Martin 所指出的,每个字符串都需要自己的索引,正如他所解释的: ““诀窍”是“??”是一个“扩展字素簇”,由两个 Unicode 代码点组成,但算作一个 Swift 字符。”
链接了解更多关于extended grapheme cluster的详细信息
【讨论】:
您不能使用从str1
创建的idx
与不同的字符串str2
。试试isEqual("??foo", "f??oo")
:)
很诡计,我尝试了几个不同的选项但我没有使用表情符号,谢谢我会更新它
现在可以了 :) – “诀窍”是“区域指标”“??”是“扩展字素簇”,由 两个 Unicode 代码点组成, 但算作 一个 Swift 字符(与 Foundation NSString 相比,它算作 四个 UTF-16 unichar
)
感谢@MartinR,学习一些新的东西,可以避免将来很难找到的错误
@alphonse 它对我也有帮助,说实话,想出这段代码并不是一件容易的事,最后我学会了这种关于我不知道的字符串的新想法以上是关于如何制作一个比较字符串的函数?的主要内容,如果未能解决你的问题,请参考以下文章