我有NSArray(),其中包含名称,但有重复的名称,如何删除它们?
解析查询后,将对象添加到NSArray及其重复的
super()
答案 0 :(得分:2)
如果你的名字是字符串,你可以从数组中创建NSSet
,它只有不同的名字。
let names = ["John", "Marry", "Bill", "John"]
println(names)
let set = NSSet(array: names)
println(set.allObjects)
打印:
"[John, Marry, Bill, John]"
"[Bill, John, Marry]"
更新#1
有问题的新信息(代码片段)可能看起来像这样
var set = Set<String>()
for test in objects as [Test] {
set.insert(test.sender)
}
self.names = Array(set)
答案 1 :(得分:1)
为了扩展John的答案,根据定义,NSSet只包含哈希相等的每个对象的单个副本。因此,常见的模式是将数组转换为集合并返回。
这适用于任何合理实施-hash
和-isEqual:
的对象类型。正如John所示,String就是这样一个对象。
您也可以使用纯Swift:
let arrayWithDuplicates = [ "x", "y", "x", "x" ]
let arrayWithUniques = Array(Set(arrayWithDuplicates)) // => [ "y", "x" ]
但是,您似乎已经在使用NSArray
了,所以我认为John的例子更适用。
另外,正如我的示例所示,请注意,最终数组的顺序不能保证与原始顺序的顺序相同。如果您需要,我认为您可以使用NSOrderedSet
代替NSSet
。
答案 2 :(得分:0)
这是一种更复杂的方法来解决这个问题。您可以直接运行数组循环并从原始循环创建一个新循环。例如:
var check = 0
let originalArray:NSMutableArray = ["x", "y", "x", "z", "y", "z"]
let newArray: NSMutableArray = []
println(originalArray)
for var int = 0; int<originalArray.count; ++int{
let itemToBeAdded: AnyObject = originalArray.objectAtIndex(int)
for var int = 0; int<newArray.count; ++int{
if (newArray == ""){
break;
}
else if ((newArray.objectAtIndex(int) as! String) != itemToBeAdded as! String){
}
else if ((newArray.objectAtIndex(int) as! String) == itemToBeAdded as! String){
check = 1
break
}
}
if (check == 0){
newArray.addObject(itemToBeAdded)
}
}
基本上我为originalArray中的每个对象设置了一个check var = 0.,它循环遍历newArray以查看它是否已经存在,如果是,则将var设置为1并且对象不会被添加两次。