Как найти уникальное значение из массива объекта в Swift3 iOS - PullRequest
0 голосов
/ 16 февраля 2019

Я объявил 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 })

Может кто-нибудь помочь мне добиться этого.Спасибо.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Вы можете создать новый массив, в который вы будете добавлять только объекты SessionData с уникальными startTime.Чтобы упростить процесс, вы можете использовать Set, как упомянуто @ Anbu.Karthik в комментариях.

В качестве симуляции вашего 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 });
0 голосов
/ 16 февраля 2019

Это создаст массив, 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)
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...