簡體   English   中英

如何在Swift3 iOS中從對象數組中查找唯一值

[英]How to find unique value from Array of object in Swift3 iOS

我已經聲明了一個像這樣的Array

  var sessionsToDisplayTemp : [SessionData] = []

sessionsToDisplayTemp是:

[<SessionData: 0x600001c16a30> (entity: SessionData; id: 0x8b2a8ba144e57f29 <x-coredata://0A752C13-D33E-4AE2-BE3E-7B856C0EE8D9/SessionData/p3> ; data: {

    startTime = "14:30";
    switchInGroup = FALSE;

}), <SessionData: 0x600001c16a80> (entity: SessionData; id: 0x8b2a8ba144f97f29 <x-coredata://0A752C13-D33E-4AE2-BE3E-7B856C0EE8D9/SessionData/p4> ; data: {

    startTime = "13:30";
    switchInGroup = TRUE;

}), <SessionData: 0x600001c16cb0> (entity: SessionData; id: 0x8b2a8ba144fd7f29 <x-coredata://0A752C13-D33E-4AE2-BE3E-7B856C0EE8D9/SessionData/p5> ; data: {
        startTime = "13:30";
    switchInGroup = FALSE;

})]

我的問題是我必須檢查開始時間,如果開始時間相同,則必須從該數組中隱藏,並且此數組應按開始時間的順序排列。 我的意思是最后的數組應該是:

[<SessionData: 0x600001c16a30> (entity: SessionData; id: 0x8b2a8ba144e57f29 <x-coredata://0A752C13-D33E-4AE2-BE3E-7B856C0EE8D9/SessionData/p3> ; data: {

        startTime = "13:30";
        switchInGroup = TRUE;

    }), <SessionData: 0x600001c16a80> (entity: SessionData; id: 0x8b2a8ba144f97f29 <x-coredata://0A752C13-D33E-4AE2-BE3E-7B856C0EE8D9/SessionData/p4> ; data: {

        startTime = "14:30";
        switchInGroup = FALSE;

    })]

我已經根據開始時間使用了升序部分:

sessionsToDisplayTemp.sort(by: { $0.startTime?.compare(($1.startTime)!) == .orderedAscending })

誰能幫助我實現這一目標。 謝謝。

這將創建一個數組out ,該數組已排序且沒有重復

var out = [SessionData]()
for data in sessionsToDisplayTemp.sorted(by: { $0.startTime < $1.startTime}) {
    if out.isEmpty {
        out.append(data)
    } else if let last = out.last, last.startTime != data.startTime {
        out.append(data)
    }
} 

您可以創建一個新數組,在其中僅附加具有唯一startTimeSessionData對象。 為了簡單起見,您可以使用@ Anbu.Karthik在注釋中提到的Set

作為您的SessionData的模擬,我使用元組

var sessionToDisplay : [(startTime: String, switchInGroup: Bool)] = [
  (startTime: "14:30", switchInGroup: false),
  (startTime: "13:30", switchInGroup: true),
  (startTime: "13:30", switchInGroup: false),
];

然后,代碼將如下所示:

var uniqueTimes = Set<String>();
var newArr : [(startTime: String, switchInGroup: Bool)] = [];

//Add only the objects with unique startTime (first occurrence in original array)
for (st, sig) in sessionToDisplay{
  if(uniqueTimes.insert(st).inserted){
    newArr.append((st, sig));
  }
}

//Sort as you need
newArr.sort(by: { $0.startTime.compare(($1.startTime)) == .orderedAscending });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM