Обновление позиционных данных в списке при удалении произвольных строк - PullRequest
0 голосов
/ 05 марта 2020

Предположим, у меня есть простой объект, состоящий из полей 'Позиция' и 'Значение', где позиция - это целое число, которое указывает на 'строку', к которой принадлежат данные.

Как убедиться, что 'Позиция' обновлена правильно (поле позиции уменьшается на правильное число, где это необходимо), если произвольные строки удалены?

Например, список данных выглядит следующим образом:

[{Position: 1, Value: "1"}, {Position: 2, Value: "2"}, {Position: 3, Value: "3"} ...]

Предполагая, что я знаю, какие строки были удалены как У меня есть их список, например, [2,3,4] или [2,4] et c.

Номера удаленных строк не могут быть последовательными, и может быть несколько объектов с одинаковым положением. Данные не обязательно упорядочены по позиции в списке данных.

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

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Хорошо, у меня есть 3 идеи, как этого добиться. Проблема заключается в том, что ВСЕ строки должны быть удалены одновременно, и тот факт, что номера удаленных строк не могут быть последовательными. Это означает, что простое изменение позиции объекта путем циклического перемещения по списку удаленных строк работать не будет (это будет один за другим, а не все сразу). Итак, мои идеи:

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

идея 2: Вы можете добавить новый атрибут к объекту, что-то вроде «fallDistance». Который будет хранить, насколько уменьшится объект. Таким образом, после циклического перемещения по списку удаленных строк вы обновляете положение объектов на основе этого значения.

идея 3: Упорядочите список удаленных строк, чтобы итерация по ним сверху гарантировала правильный конечный результат , Это работает как для итерации по списку удаленных строк, так и по списку объектов.

Я предполагаю, что алгоритм 3 будет работать быстрее всего, в основном из-за того, что делать очень мало. Это действительно зависит от того, какой язык вы используете.

0 голосов
/ 09 марта 2020

Спасибо за ваши предложения. Это помогло мне понять, что правильно сначала отсортировать список данных по позициям, и я считаю, что у меня есть решение, которое будет работать на его основе.

По сути, алгоритм будет выглядеть так:

  1. Сортировка данных по позиции
  2. Удаление объектов, помеченных для удаления (если есть, если не продолжить)
  3. Итерация по данным со счетчиком для новой позиции (начиная с 1 ) и маркер для старой позиции. Установите положение каждого объекта в значение счетчика. Когда встречаются данные с положением выше маркера, установите маркер в это положение и увеличьте счетчик.
...