我有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 }
这个实现是丑陋的.