我有2个数组:
fruitsArray = ["apple","mango","blueBerry","orange"] vegArray = ["tomato","potato","blueBerry"]
如何获取这两个数组中的常用项目列表
ouptput = ["mango","blueBerry"]
我不能使用if(array,string),因为我想比较2个数组.
请帮忙
解决方法
你不需要一套(如上面提到的注释).
您可以使用一般的功能,类似于苹果在其Swift Tour中使用的功能,因此避免投射:
func anyCommonElements <T,U where T: SequenceType,U: SequenceType,T.Generator.Element: Equatable,T.Generator.Element == U.Generator.Element> (lhs: T,rhs: U) -> Bool {
for lhsItem in lhs {
for rhsItem in rhs {
if lhsItem == rhsItem {
return true
}
}
}
return false
}
此函数可以使用任何两个数组(SequenceTypes),如果它们的任何元素相同,则返回true.
你可以简单地修改这个泛型函数来打包一个字符串数组,然后返回.
例如:
func arrayOfCommonElements <T,rhs: U) -> [T.Generator.Element] {
var returnArray:[T.Generator.Element] = []
for lhsItem in lhs {
for rhsItem in rhs {
if lhsItem == rhsItem {
returnArray.append(lhsItem)
}
}
}
return returnArray
}
这样的用法:
var one = ["test2","dog","cat"] var other = ["test2","cat","dog"] var result = arrayOfCommonElements(one,other) print(result) //prints [test2,dog,cat]
这里增加的好处是这个函数也可以用于所有相同类型的数组.所以后来如果你需要比较两个[myCustomObject]数组,一旦它们都符合相当的,你就全部设置好了! (双关语)
编辑:(对于非常见的元素),你可以这样做
func arrayOfNonCommonElements <T,rhs: U) -> [T.Generator.Element] {
var returnArray:[T.Generator.Element] = []
var found = false
for lhsItem in lhs {
for rhsItem in rhs {
if lhsItem == rhsItem {
found = true
break
}
}
if (!found){
returnArray.append(lhsItem)
}
found = false
}
for rhsItem in rhs {
for lhsItem in lhs {
if rhsItem == lhsItem {
found = true
break
}
}
if (!found){
returnArray.append(rhsItem)
}
found = false
}
return returnArray
}
这个实现是丑陋的.