2016-10-06 2 views
0

私のアプリケーションには、 'date:NSDate?'のようないくつかのプロパティを持つオブジェクト 'クラス:EventObjects'の配列があります。と 'stuffToDo:String?'カレンダーデータベースから取得されます。ここで達成しようとしているのは、同じ日付プロパティを持つすべてのEventObjectを、 'class:EventsAtSameDate'の別のオブジェクトにまとめていることです。配列内のオブジェクトを比較して、同じ値を別々の新しいオブジェクトに入れます

class EventsAtSameDate: NSObject 
{ 
    var date:NSDate? 
    var eventObjects:NSArray<EventObject>? 
} 

最後にEventsAtSameDateをネストした配列があります。

.filter .sortInPlaceなどの関数を使用して配列を検索およびソートする方法を知っています。しかし、どのようにして配列の日付を互いに比較し、それらを別の入れ子配列に入れることができますか?

答えて

2

EventObjectの初期配列に対して1回の繰り返しを実行しながら、存在する日付を記録する辞書をインスタンス化することができます。私は日によってあなたのイベントの配列をソートし、それらを反復でしょう

var nestedArrayOfEventsAtSameDateObjects = [EventsAtSameDate]() 

//instantiate a dictionary that uses Date as the key and an array of EventObject as the associated value 
var dictionary = [Date: [EventObject]]() 

//iterate through your intial array of EventObjects 
for obj in eObjs { 
    //check if you have already seen the date in the collection 
    if dictionary[obj.date] != nil { 
     //if you have - then append it to that date 
     dictionary[obj.date]?.append(obj) 
     continue 
    } 
    //otherwise, add it to the dictionary for a check later in the loop 
    dictionary[obj.date] = [obj] 
} 


//then iterate through the dictionary 

for (date, eObjs) in dictionary { 
    if eObjs.count > 1 { 
     let sameDate = EventsAtSameDate() 
     sameDate.date = date 
     sameDate.eventObjects = eObjs 
     nestedArrayOfEventsAtSameDateObjects.append(sameDate) 
    } 
} 
1

:その後、コードは次のようになりますEventsAtSameDateのクラスをインスタンス化し、nestedArrayOfEventsAtSameDateObjects: [EventsAtSameDate]

にそれらを追加する辞書を繰り返します。その場合は、日付が前の日付よりも新しいかどうかをチェックし、そうであれば別の記憶域を作成します。

class Event { 
    var date:Date! 
} 

class EventsList 
{ 
    var date:Date! 
    var events:[Event]! 
} 

func createEventsLists(sortedEvents: [Event]) -> [EventsList] { 
    guard sortedEvents.count > 0 else { return [] } 

    var currentEventList = EventsList() 
    var result = [currentEventList] 
    var lastDate = sortedEvents.first!.date 

    for event in sortedEvents { 
     let newDate = event.date.compare(lastDate!) != .orderedDescending 
     if newDate { 
      currentEventList = EventsList() 
      result.append(currentEventList) 
     } 
     currentEventList.events.append(event) 
     lastDate = event.date 
    } 
    return result 
} 
+0

これも機能する可能性があります。私の場合、シラバスからの辞書のヒントは私の問題を解決しました。ありがとう。 – Thoms

関連する問題