Как написать алгоритм для сортировки указанных объектов? - PullRequest
0 голосов
/ 24 августа 2011

В моем сценарии у меня есть следующие объекты

<playlist>
  <program id="s63e" start="2011-8-24 16:00:00" end="2011-8-24 17:00:00" priority="2" />
  <program id="sv6w" start="2011-8-24 19:00:00" end="2011-8-24 21:00:00" priority="2" />
  <program id="3b9a" start="2011-8-26 11:00:00" end="2011-8-26 13:00:00" priority="0" />
</playlist>

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

Более низкое значение приоритета имеет более высокий приоритет. Результат сортировки должен возвращать значение, тип которого - Словарь, словарь просто хранит, какое время выполняет какая программа. Любой способ мышления или алгоритм сортировки приветствуется.

Ответы [ 2 ]

1 голос
/ 24 августа 2011

У вас есть несколько проблем / вопросов, поэтому давайте разберем их. Я бы сделал следующее:

  1. Разобрать каждую запись "программы" в простой объект с соответствующими свойствами для каждого атрибута XML. Результатом будет несортированный список нового класса, который вы только что создали, например, List<ProgramEntry>.
  2. Реализуйте IComparer, который сравнивает 2 экземпляра вышеупомянутых объектов и решает, какой из них стоит перед другим в отсортированном списке. Есть много примеров о том, как это сделать. Здесь вы бы реализовали свою логику приоритета против часового пояса, например, вы могли бы сделать так, чтобы ваш компаратор проверил, есть ли совпадение времени начала и окончания, и если да, используйте приоритет для разрешения конфликта.
  3. Сортировка списка, созданного в 1. с использованием этого IComparer. Это так же просто, как сказать myList.Sort(MyComparer);. List.Sort автоматически использует эффективный алгоритм и вызывает код сравнения только несколько раз. (пожалуйста, используйте правильные соглашения об именах, это только пример). Во время сравнения вы также можете пометить «потерянную» запись как отключенную, установив для нее свойство.
  4. Добавьте все элементы из вашего отсортированного списка в словарь, где он не помечен как отключенный.

Это всего лишь один из способов сделать это, я уверен, что вы можете придумать другие, или те, которые используют другой алгоритм приоритета, чтобы определить, какие записи помечены как отключенные (например, одна 3-часовая запись с приоритетом) 2 лучше, чем три 1-часовых записи, с которыми она пересекается?).

1 голос
/ 24 августа 2011

Вы можете использовать LINQ для группировки элементов по приоритету, а затем отсортировать их по времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...