2016-07-18 6 views
4

У меня есть пользовательский класс, как это -Как получить уникальные идентификаторы объектов в массиве быстрой

class Event: NSObject 
{ 
    var eventID: String? 
    var name:String? 
} 

Теперь у меня есть массив Event объекта, как

var events = [Event]() 

var event1 = Event() 
event1.eventID = "1" 
event1.name = "Anu" 

var event2 = Event() 
event2.eventID = "2" 
event2.name = "dev" 

var event3 = Event() 
event3.eventID = "1" 
event3.name = "Anu" 

events.append(event1) 
events.append(event2) 
events.append(event3) 

, чтобы получить unque eventID из массива я написал такой код, который отлично работает -

func getUniqueIDsFromArrayOfObjects(events:[Event])->NSArray 
{ 
    let arr = events.map { $0.eventID!} 
    let uniquearr:NSMutableArray = NSMutableArray() 
    for obj in arr 
    { 
     if !uniquearr.containsObject(obj) { 
      uniquearr.addObject(obj) 
     } 
    } 
    return uniquearr; 
} 

print(getUniqueIDsFromArrayOfObjects(events)) 

Я хотел знать, это ther e любой альтернативный способ получить уникальный идентификатор из массива объектов более эффективно, чем я использую. Может быть что-то, используя NSPredicate.

Поскольку массив имеет thousands объектов, мой код будет делать больше итераций.

+1

Простейший способ я хотел бы предложить, чтобы создать набор. –

+0

Если вам не нужен порядок результирующего массива, вы можете просто использовать: let finalArray = Array (Set (arr)) –

+0

Возможный дубликат [Есть ли в API Swift простой способ удаления повторяющихся элементов из массива ?] (http://stackoverflow.com/questions/25738817/does-there-exist-within-swifts-api-an-easy-way-to-remove-duplicate-elements-fro) – dfri

ответ

8

Вы можете использовать Set, чтобы получить только уникальные значения. Я бы предположил, что ваша функция возвращает массив Swift, а не NSArray.

func getUniqueIDsFromArrayOfObjects(events:[Event])->[String] 
{ 
    let eventIds = events.map { $0.eventID!} 
    let idset = Set(eventIds) 
    return Array(idset) 
} 
2

A Set - это коллекция, подобная массиву, которая предотвращает дубликаты. Вы можете сделать:

func getUniqueIDsFromArrayOfObjects(events:[Event])->[Event] { 
    return Array(Set(events.map { $0.eventID! })) 
} 

Обратите внимание, что порядок элементов в наборе не определен, поэтому, если вы заботитесь о порядке элементов, вы должны попробовать другое решение.

0
let uniqueRecords = jobs.reduce([], { 
     $0.contains($1) ? $0 : $0 + [$1] 
    }) 
Смежные вопросы