如何制作比较字符串的函数?
How to make a function that compares strings?
我想制作一个比较字符串的函数。
我不想使用相等运算符 (==),我希望它只适用于 Swift 语言。
首先我创建了一个函数,它接受 2 个字符串和 returns bool 类型。
然后我用 for in 语法循环这些字符串。
并且要比较这些字符,如果字符串具有相等的值,则应该 return 为真,否则为假。有没有更好的方法?
func isEqual(str1:String, str2:String) -> Bool {
var result = false
for char in str1 {
}
for char2 in str2 {
}
//Compare characters.
return result
}
==
可以很好地处理 Swift 中的字符串。出于教育目的
(正如我从您的评论中得出的结论 "because I'm practicing...")
您可以将其实现为:
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)
returns 来自给定的对的序列
序列,这是枚举字符串的便捷方式
"in parallel".
一旦你理解了它的工作原理,你就可以缩短它,
例如:
func myStringCompare(str1 : String, str2 : String) -> Bool {
return count(str1) == count(str2) && !contains(zip(str1, str2), { [=11=] != })
}
比较字符串长度是必要的,因为 zip()
序列
一旦其中一个字符串用完就终止。看一下
@drewag 对 In Swift I would like to "join" two sequences in to a sequence of tuples 的回答
用于替代 Zip2WithNilPadding
序列。
如果您不想使用内置的 zip()
函数(再次为
educational/self-learning 目的!)那么你可以使用事实
字符串是 序列 ,并使用并行枚举它们
序列 生成器 。这不仅适用于字符串,而且适用于
对于任意序列,只要底层元素可以
进行相等性测试,所以让我们将其设为 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
我的解决方案略有不同,因为我不知道 zip 运算符,我想它不如 Martin great use of tuple 的 post 高效。
问得好阿方斯
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 所指出的,每个字符串都需要自己的索引,正如他所解释的那样:
"The "trick" 是 "" 是一个 "extended grapheme cluster" 并且由两个 Unicode 代码点组成,但算作一个 Swift 字符。"
Link 有关 extended grapheme cluster
的更多详细信息
我想制作一个比较字符串的函数。 我不想使用相等运算符 (==),我希望它只适用于 Swift 语言。
首先我创建了一个函数,它接受 2 个字符串和 returns bool 类型。 然后我用 for in 语法循环这些字符串。 并且要比较这些字符,如果字符串具有相等的值,则应该 return 为真,否则为假。有没有更好的方法?
func isEqual(str1:String, str2:String) -> Bool {
var result = false
for char in str1 {
}
for char2 in str2 {
}
//Compare characters.
return result
}
==
可以很好地处理 Swift 中的字符串。出于教育目的
(正如我从您的评论中得出的结论 "because I'm practicing...")
您可以将其实现为:
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)
returns 来自给定的对的序列
序列,这是枚举字符串的便捷方式
"in parallel".
一旦你理解了它的工作原理,你就可以缩短它, 例如:
func myStringCompare(str1 : String, str2 : String) -> Bool {
return count(str1) == count(str2) && !contains(zip(str1, str2), { [=11=] != })
}
比较字符串长度是必要的,因为 zip()
序列
一旦其中一个字符串用完就终止。看一下
@drewag 对 In Swift I would like to "join" two sequences in to a sequence of tuples 的回答
用于替代 Zip2WithNilPadding
序列。
如果您不想使用内置的 zip()
函数(再次为
educational/self-learning 目的!)那么你可以使用事实
字符串是 序列 ,并使用并行枚举它们
序列 生成器 。这不仅适用于字符串,而且适用于
对于任意序列,只要底层元素可以
进行相等性测试,所以让我们将其设为 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
我的解决方案略有不同,因为我不知道 zip 运算符,我想它不如 Martin great use of tuple 的 post 高效。
问得好阿方斯
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 所指出的,每个字符串都需要自己的索引,正如他所解释的那样: "The "trick" 是 "" 是一个 "extended grapheme cluster" 并且由两个 Unicode 代码点组成,但算作一个 Swift 字符。"
Link 有关 extended grapheme cluster
的更多详细信息