如何制作一个比较字符串的函数?

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 它对我也有帮助,说实话,想出这段代码并不是一件容易的事,最后我学会了这种关于我不知道的字符串的新想法

以上是关于如何制作一个比较字符串的函数?的主要内容,如果未能解决你的问题,请参考以下文章

无法比较字符串中的空间

比较两个字符串的 TSQL 函数

如何在javascript中比较两个字符串日期?

数据结构与算法各种字符串Hash函数比较

如何利用strcmp函数比较两个字符串是不是相同?

Java基础字符串之如何比较字符串