如何从NSArray中删除重复的对象?

时间:2015-08-20 16:43:07

标签: swift parse-platform

我有NSArray(),其中包含名称,但有重复的名称,如何删除它们?

解析查询后,将对象添加到NSArray及其重复的

super()

3 个答案:

答案 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并且对象不会被添加两次。