Как следует из длинного названия этого вопроса, я пытаюсь отсортировать массив объектов по этим свойствам объекта, но у меня возникают проблемы с порядком, в котором возвращается массив. По сути, моя структура базы данных имеет каждую дату по порядку, а затем записи под возрастающими числами в каталоге этой даты. Ниже представлено визуальное представление конструкции:

Balances
   -11/7/17
        -0
            -name: "Name 1 Here"
        -1
            -name: "Name 2 Here"
        -2
            -name: "Name 3 Here"
   -11/8/17
        -0
            -name: "Name 1 Here"
        -1
            -name: "Name 2 Here"
        -2
            -name: "Name 3 Here"
   -11/9/17
        -0
            -name: "Name 1 Here"
        -1
            -name: "Name 2 Here"
        -2
            -name: "Name 3 Here"

Когда я извлекаю данные из базы данных через событие SingleValueEvent и добавляю их в массив настраиваемых объектов, данные в массиве по какой-то причине становятся неупорядоченными и не остаются в точном порядке, поскольку данные хранятся в база данных. Чтобы решить эту проблему, я попытался использовать следующий код для упорядочивания массива:

self.tableArray = self.tableArray.sorted(by: { $0.date < $1.date })

self.tableArray.sort(by: { (object1, object2) -> Bool in
    if object1.date != object2.date {
        return object1.date < object2.date
    } else {
    return object1.date < object2.date
    }
})

Массив, возвращаемый после использования любой из двух строк кода, сортируется по дате каждого объекта, но порядок каждого из элементов под датой в базе данных нарушен. Я знаю, что это немного сбивает с толку, поэтому я включил визуальное представление ниже, которое, надеюсь, поможет.

Original Array:

 Item 1: 

  date: 11/14/17
  name: Name 1

 Item 2: 

  date: 11/13/17
  name: Name 1

 Item 3: 

  date: 11/13/17
  name: Name 2

 Item 4: 

  date: 11/7/17
  name: Name 1

Sorted Array:

 Item 1: 

  date: 11/7/17
  name: Name 1

 Item 2: 

  date: 11/13/17
  name: Name 2

 Item 3: 

  date: 11/13/17
  name: Name 1

 Item 4: 

  date: 11/14/17
  name: Name 1

Благодарность!

-2
kps2501 15 Ноя 2017 в 07:05

1 ответ

Лучший ответ

Причин может быть несколько, способ сериализации или сортировки в хранилище - без особого понимания того, используете ли вы CoreData, Real, SQLite или другие ...

TL; DR, если вы хотите убедиться, что порядок в точности соответствует тому, что вы хотите, и похоже, что у вас есть несколько критериев сортировки, определите эти критерии как атрибут. Вы не всегда можете гарантировать, что постоянство будет поддерживать порядок, поэтому встроите его в схему.

Т.е.

{name, date}

Добавить дополнительный атрибут

{name, date, order}.

Свойство order может быть глобально уникальным или просто уникальным для элементов на эту дату.

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

self.tableArray.sort(by: { (object1, object2) -> Bool in
    if object1.date != object2.date {
        return object1.date < object2.date
    } else {
        return object1.order < object2.order
    }
})
1
Mitchell Currie 15 Ноя 2017 в 04:41