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

时间:2015-06-02 11:12:04

标签: string function swift compare

我想创建一个比较字符串的函数。 我不想使用相等的运算符(==),我希望它只适用于Swift语言。

首先我创建了一个带2个字符串的函数,并返回bool类型。 然后我用for语法循环这些字符串。 并且想比较这些字符,如果字符串具有相等的值,它应该返回true,否则返回false。还有更好的办法吗?

func isEqual(str1:String, str2:String) -> Bool {
    var result = false

    for char in str1 {

    }
    for char2 in str2 {

    }
    //Compare characters.
    return result
}

2 个答案:

答案 0 :(得分:5)

==可以在Swift中使用Strings。用于教育目的 (正如我从你的评论中得出的结论“因为我正在练习......”) 你可以实现它:

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()功能(再次使用 教育/自学目的!)然后你可以使用这个事实 字符串是序列,并使用并行枚举它们 序列 generator 。这不仅适用于字符串,也适用于字符串 对于任意序列,只要底层元素可以 测试是否相等,所以让它成为泛型函数:

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

答案 1 :(得分:2)

我的解决方案略有不同,因为我对zip运算符一无所知,我认为它不如Martin对元组的大量使用效率高。

很棒的问题alphonse

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指出的那样,每个字符串都需要自己的索引,正如他所解释的那样:  &#34;&#34;技巧&#34;那是&#34;&#34;是一个扩展的字形集群&#34;并且由两个Unicode代码点组成,但算作一个Swift字符。&#34;

链接了解有关extended grapheme cluster

的更多详情