Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> удалить из списка не дубликаты 
V
    Опции темы
Dmitry1987
Дата 5.12.2013, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 3.5.2008

Репутация: нет
Всего: нет



Есть отсортированный список (TStringList) значений:

1
1
2
3
3
4
5

Задача: оставить в списке только цепочки значений (т.е. удалить не дубликаты). Как максимально быстро это сделать (за один проход)?
PM MAIL   Вверх
Illusion Dolphin
Дата 5.12.2013, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 5
Всего: 63



Одиночное значение это когда пред элемент и след элемент не равны текущему.


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
БелАмор
Дата 5.12.2013, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: 7
Всего: 17



Цитата(Dmitry1987 @  5.12.2013,  10:43 Найти цитируемый пост)
Задача: оставить в списке только цепочки значений (т.е. удалить не дубликаты). 

Если я правильно понял, нужно удалить значения, встречающиеся только один раз?
Т.е. в вашем примере таким образом?

1
1
2  // удалить
3
3
4  // удалить
5  // удалить

Тогда алгоритм может выглядеть примерно так:

Код

Процедура с параметром типа TStrings (чтобы можно было передавать ссылку на любого наследника TStrings)
  Объявления:
    Строка
    Счётчик(повторяющихся значений)
    Индекс
  Код:
    Счётчик=0
    Цикл по элементам от конца к началу
      Если это первый проход
        Присвоить Строке ТекущийЭлемент
        Увеличить Счётчик
      Иначе
        Если ТекущийЭлемент совпадает со значением Строки
          Увеличить Счётчик
        Иначе
          Если Счётчик=1
            Удалить ПредыдущийЭлемент (Индекс+1)
          Присвоить ТекущийЭлемент Строке
          Счётчик=1
 


Это сообщение отредактировал(а) БелАмор - 5.12.2013, 11:02
PM   Вверх
БелАмор
Дата 5.12.2013, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: 7
Всего: 17



Кстати, в приведённом мной алгоритме не обрабатывается уникальный элемент в начале списка (например, в приведённом примере добавить один "0" в начало).
Исправленный вариант:

Код

Процедура с параметром типа TStrings
  Объявления:
    Строка
    Счётчик
    Индекс
  Код:
    Счётчик = 0
    Цикл по элементам от конца к началу
      Если это первый проход (Счётчик = 0)
        Строка = ТекущийЭлемент
        Счётчик = 1
        Следующая итерация (Continue)

      Если ТекущийЭлемент = Строка
        Увеличить Счётчик
      Иначе
        Если Счётчик = 1
          Удалить ПредыдущийЭлемент (Индекс+1)
        Строка = ТекущийЭлемент
        Счётчик = 1

      Если это последний проход (Индекс = 0)
        Если Счётчик = 1
          Удалить ТекущийЭлемент  


PM   Вверх
fastergus2dog
Дата 3.1.2014, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.7.2013

Репутация: нет
Всего: нет



За один проход никак. Все равно нужно использовать цыкл который будет делать переборку данных.

Это сообщение отредактировал(а) fastergus2dog - 3.1.2014, 01:18
PM MAIL WWW   Вверх
northener
Дата 5.1.2014, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(fastergus2dog @  3.1.2014,  01:17 Найти цитируемый пост)
За один проход никак. Все равно нужно использовать цыкл который будет делать переборку данных.

С чего бы это? Топик невнимательно прочитали? Для отсортированного списка достаточно одного прохода.



--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0685 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.