Как найти и удалить дубликаты из "List`а(списка)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ssv22
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 06.11.2005 (Вс) 8:47

Как найти и удалить дубликаты из "List`а(списка)

Сообщение ssv22 » 26.02.2010 (Пт) 0:13

Имеется Список. Сколько там элементов заранее неизвестно, сколько совпадающих элементов тоже заранее неизвестно.
Нужно найти и удалить совпадающие элементы.
Куда копать - что-то "заклинило"...

Заранее спасибо!

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение SLIM » 26.02.2010 (Пт) 1:02

Думаю у ListBox-а такого встроенного функционала нет, поэтому алгоритм придется писать самому.
В общем случае таких алгоритмов куча.
Пишите жизнь на чистовик.....переписать не удастся.....

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение iGrok » 26.02.2010 (Пт) 3:20

А что тут сложного?
Пройти по списку, добавляя каждый элемент в коллекцию.
Если такой элемент в коллекции уже есть - удалять текущий и идти дальше.
label:
cli
jmp label

qwertyhp
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 156
Зарегистрирован: 07.10.2009 (Ср) 15:02
Откуда: Москва

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение qwertyhp » 26.02.2010 (Пт) 3:31

Удалено
Последний раз редактировалось qwertyhp 28.02.2010 (Вс) 0:21, всего редактировалось 1 раз.
Пятачок Forever! :)

ssv22
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 06.11.2005 (Вс) 8:47

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение ssv22 » 26.02.2010 (Пт) 4:36

Да сложного вроде и ничего: просто захотелось узнать, а нет ли более эффективных алгоритмов...
(Что-то типа "связанных списков" в Lisp`e [НЕ LIST`t])...
Вот, сортировка в List`e есть, а удаление дубликатов - нет!
В Prolog`e, наверное, еще проще будет этот кусок кода написать.

PS. я не спорю, просто рассуждаю...
PPS. вроде-бы VB у меня "тормозит", поэтому и начал искать...
А VB связан с SW и если в SW входящих ~2000-5000 штук, начинает "тормозить"...

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение SLIM » 26.02.2010 (Пт) 7:28

Тормозить может от того что ты ищешь прямо в списке. Как вариант нужно загнать содержимое строк в отдельный массив (это уже говорили), или, как я когда-то делал по совету Хакера, не использовать VB-ную обертку, а создавать и искать с помощью API-шек, помню в скорости это прибавило точно.
Пишите жизнь на чистовик.....переписать не удастся.....

ssv22
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 06.11.2005 (Вс) 8:47

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение ssv22 » 26.02.2010 (Пт) 10:52

А как вот "справиться" со счтыванием рекурсивного дерева - ни глубина, на степень вложенности - неизвестны?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение Хакер » 26.02.2010 (Пт) 10:58

qwertyhp писал(а):
Код: Выделить всё
For i = 1 To n - 1
   If MassiveListBox(i) <> "" Then        ' не пустая ячейка
      For j = i + 1 To n                  ' т.е. со следующего после i
         If MassiveListBox(j) <> "" Then  ' не пустая ячейка
            If MassiveListBox(i) = MassiveListBox(j) Then ' нашли совподение
               MassiveListBox(j) = ""  ' при нахождении повтора обнуляем его
            End If
         End If
      Next j
   End If
Next i


Жуткий код, фу.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ssv22
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 06.11.2005 (Вс) 8:47

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение ssv22 » 26.02.2010 (Пт) 12:21

Вроде как похоже на код от `qwertyhp` ...
Но мой последний вопрос был про рекурсию...

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение Денис » 26.02.2010 (Пт) 14:42

ssv22 писал(а):Вроде как похоже на код от `qwertyhp` ...
Но мой последний вопрос был про рекурсию...


Этот код был процитирован с пометкой "ФУ"

:lol:
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

ssv22
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 06.11.2005 (Вс) 8:47

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение ssv22 » 26.02.2010 (Пт) 16:19

Это я уже понял. Спасибо.
Но вот как "справиться" со счтыванием рекурсивного дерева - ни глубина, на степень вложенности - неизвестны?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение Хакер » 26.02.2010 (Пт) 16:22

Какое ещё дерево? Я не вижу в исходном вопросе никакого упоминания о каких-либо деревьях. Откуда оно возникло?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ssv22
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 06.11.2005 (Вс) 8:47

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение ssv22 » 26.02.2010 (Пт) 21:27

Уточняю: я имел ввиду "дерево" по типу обозревателя Windows - сколько там папок, сколько файлов - неизвестно. Если не ошибаюсь, такие деревья называются "бинарными".
Я его сам строю при считывании компонентов из SolidWorks`a.
Допустим, это дерево состоит из 5 подсборок, каждая из которых(а может и не каждая) состоит тоже из п/сборок.
Имеем некоторый неизвестный уровень вложенности. Сборка самого низжего уровня состоит только из деталей.
В API SW есть примеры, но там применяется только рекурсивные методы для доступа к каждому элементу дерева(например, получить имена компонентов - всех; подсчитать их кол-во и т.д.).
Кол-во компонентов может достигать 5,000 - 10,000...
Вот и думаю: переходить на `C` или из VB что-то можно "выжать".

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение Хакер » 26.02.2010 (Пт) 21:35

Дальше-то что?

Не улавливаю связи между деревьями (иерархией сборок) и поиском дубликатов.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ssv22
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 06.11.2005 (Вс) 8:47

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение ssv22 » 26.02.2010 (Пт) 21:51

А дальше возникают жуткие тормоза при работе на VB!
На `C` скорость на 2 порядка больше. Но не владею им. Пока.
Вот я и спрашиваю: можно ли что выжать из VB или бросать его и браться за `C` ?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение Хакер » 26.02.2010 (Пт) 21:53

Можно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ssv22
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 06.11.2005 (Вс) 8:47

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение ssv22 » 26.02.2010 (Пт) 23:17

Ну и...
(краткость - сестра таланта?)

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение SLIM » 27.02.2010 (Сб) 0:40

Я тебе уже говорил этот способ.
Пишите жизнь на чистовик.....переписать не удастся.....

qwertyhp
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 156
Зарегистрирован: 07.10.2009 (Ср) 15:02
Откуда: Москва

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение qwertyhp » 27.02.2010 (Сб) 1:04

Удалено
Последний раз редактировалось qwertyhp 28.02.2010 (Вс) 0:21, всего редактировалось 1 раз.
Пятачок Forever! :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение Хакер » 27.02.2010 (Сб) 2:10

ssv22 писал(а):Ну и...
(краткость - сестра таланта?)

Что и?

Из тебя слова клещами не вытащишь, и, значит, я должен телепатически догадываться, что у тебя за задача, связанная с деревьями?

С слишком стар для этого.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ssv22
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 06.11.2005 (Вс) 8:47

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение ssv22 » 27.02.2010 (Сб) 8:39

Я извиняюсь, наверное задачу обрисовал неверно:
Итак, имеем сборку в SW, структура ее неизвестна - сколько там подсборок и деталей, какой уровень вложенности - тоже.

- Задача №1: считать эту структуру (т.е.) дерево и где-то разместить, или в списке или текстовом файле или в файле Excel... Я решал подобную задачу, но то ли у меня алгоритм неаерный, то ли VB медленно работает. Все делается довольно долго...

- Задача №2: уже имея это деревов провести операцию переоткрытия всех файлов, находящихся в нем(в дереве) - открыть и тут же закрыть.
Тут и возникает вопрос о дубликатах: нет никакой необходимости переоткрывать их все - достаточно из группы этих дубликатов, открыть всего один.
Пример: сборка 2200 компонентов, из них уникальных деталей - 140. Т.о. досточно переоткрыть только эти 140 компонентов!
Есть ведь разница между 2200 и 140!
Поэтому я и делаю вывод: перед операцией переоткрытия, нужно "почистить" это дерево - удалить дубликаты...
И хранить полное дерево тоже нет необходимости.
Представьте себе узел, допустим колесо авто, а в нем 10 болтов, шайб, гайек
Можно записать так:
"Колесо"
- болт 01
- болт 02
...
- болт 10

- шайба 01
- шайба 02
...
- шайба 10

И т.д.
А можно и так:

"Колесо"
- болт 01 - 10шт
...
- шайба 01 - 10 шт
...
и т.д.


И это при 10-ти компонентов. А если их 20000-6000 штук?

qwertyhp
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 156
Зарегистрирован: 07.10.2009 (Ср) 15:02
Откуда: Москва

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение qwertyhp » 27.02.2010 (Сб) 14:48

Удалено
Последний раз редактировалось qwertyhp 28.02.2010 (Вс) 0:22, всего редактировалось 1 раз.
Пятачок Forever! :)

ssv22
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 06.11.2005 (Вс) 8:47

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение ssv22 » 27.02.2010 (Сб) 16:25

Ну Вы даете! Я на этом форуме с 2004-го года и ко мне обращаются с вопросами!
Можно сказать, я - часть этого форума.
И что мне самого себя спрашивать?
Ценный совет...

ssv22
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 06.11.2005 (Вс) 8:47

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение ssv22 » 27.02.2010 (Сб) 17:03

Я задал вопрос, который НЕ имеет никакого отношения к SW !
Пoнятие "List" - какое отношение имеет к SW ?
Абсолютно никакого!
В любой книге по программированию приводится пример рекурсивного метода: "вычисление факториала".
Вот я и хотел "вспомнить" другой, не рекурсивный метод.
На VB к SW я уже пишу 10 лет. До этого я писал на AutoLisp`e к ACAD`y, тоже лет10. Были и Prolog и Delphi и Clarion...
Никаких вопросов, касающихся SW я не задавал, только про алгоритмы VB.
Это меня уже "пытать" начали: для чего, не умеешь вопросы задавать...

"Абидна, да! Ниче не сделал, да..." :-)

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение iGrok » 27.02.2010 (Сб) 17:19

Так. Ну во-первых.
Сказать, почему тот или иной алгоритм работает "медленно" не видя алгоритма мы не можем. =)
Поэтому давай алгоритм, выполняющий первую задачу. Если увидим там ошибки и т.п. - подскажем. А так, без кода... Телепат у нас на форуме только один - Хакер, но и он уже устал от использования своих телепатических способностей, так что без чёткой формулировки вопроса он не поможет. =)

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

"Коллекции" и т.п. - легко ищутся поиком по форуму/гуглю.
Если тебе нужно ТОЛЬКО переоткрыть файлы, а их список толком не нужен - то всё еще проще - не надо ничего удалять, можно просто переоткрывать только те, которых ещё нет в коллекции, после чего добавлять их туда.
Либо делать это ещё при получении дерева. Тогда ещё проще и быстрее будет. Это если тебе не нужно само дерево. =)

Как вариант, можно составлять коллекцию файлов ещё при получении дерева.

Как-то так. =)

В общем, пиши конкретную задачу, давай алгоритм, который медленно работает, а там посмотрим.
label:
cli
jmp label

ssv22
Обычный пользователь
Обычный пользователь
 
Сообщения: 89
Зарегистрирован: 06.11.2005 (Вс) 8:47

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение ssv22 » 27.02.2010 (Сб) 18:23

А как Вы посмотрите алгоритм без SW (сборок, деталей, чертежей)?
Вот могу привести пример из SW API, но если нет SW, проверить его в дейсствии не получится.
Вот пример кода на VB:

name: Traverse Assembly at Component Level Example (VB)

This example shows how to traverse an assembly at the component level. It is assumed that you have an active assembly.
Код: Выделить всё
'------------------------------------------------------------------
' вспом.функция (некоторые комментарии мои)
Sub TraverseComponent  swComp As SldWorks.Component2,   nLevel As Long )
    Dim vChildComp                  As Variant
    Dim swChildComp                 As SldWorks.Component2
    Dim swCompConfig                As SldWorks.Configuration
    Dim sPadStr                     As String
    Dim i                           As Long

    For i = 0 To nLevel - 1
        sPadStr = sPadStr + "  "
    Next i

    vChildComp = swComp.GetChildren     ' подчиненный компонент(подсборка)

    For i = 0 To UBound(vChildComp)
        Set swChildComp = vChildComp(i)
              ' если ChildComp является подсборкой, вызываем опять "TraverseComponent"
        [b]TraverseComponent swChildComp, nLevel + 1  <<<====т.е.  рекурсивный вызов ф-и "TraverseComponent"[/b]    Next i
End Sub

.------------------------------------------------- ну, думаю ясно - это главная ф-я
Sub main()
    Dim swApp                       As SldWorks.SldWorks
    Dim swModel                     As SldWorks.ModelDoc2
    Dim swAssy                      As SldWorks.AssemblyDoc
    Dim swConf                      As SldWorks.configuration
    Dim swRootComp                  As SldWorks.Component2
    Dim bRet                        As Boolean

    Set swApp = CreateObject("SldWorks.Application")           'инициализация SW
    Set swModel = swApp.ActiveDoc
    Set swConf = swModel.GetActiveConfiguration

    Set swRootComp = swConf.GetRootComponent                 ' "корневой компонент"
    [b]TraverseComponent [/b]swRootComp, 1                      ' первый вызов с "главным" компонентом
End Sub
'---------------------------------------


Разница между реализацией на VB и `С` - 2-3 порядка.

Это 1-я задача: считывание структуры всей сборки и получить имена файлов компонентов и сохранить их (тут разные варианты).

2-я задача: Т.к. обычно в сборке встречаются по нескольку компонентов(они ссылаются на один и тот же файл), то нет никакой необходимости "переоткрывать" их все. В случае перестроения, напрмер. достаточно открыть один файл из группы одинаковых.
Вот, вроде все...
Вот я и хочу узнать в чем причина низкой скорости работы на VB.
[Viper] :: Используй тэги CODE! Устное предупреждение!

qwertyhp
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 156
Зарегистрирован: 07.10.2009 (Ср) 15:02
Откуда: Москва

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение qwertyhp » 27.02.2010 (Сб) 18:42

Удалено
Последний раз редактировалось qwertyhp 28.02.2010 (Вс) 0:23, всего редактировалось 1 раз.
Пятачок Forever! :)

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение Dmitriy2003 » 27.02.2010 (Сб) 18:52

ssv22 писал(а):"Абидна, да! Ниче не сделал, да..." :-)

пытаюсь наслаждаться лингвистикой - становиться трудновато, почему-бы вам не выделять блоки кода, а то все перемешивается и мысли путаются :cry:

Код: Выделить всё
This example shows how to traverse an assembly at the component level. It is assumed that you have an active assembly.
'------------------------------------------------------------------
' вспом.функция (некоторые комментарии мои)
Sub TraverseComponent swComp As SldWorks.Component2, nLevel As Long )
Dim vChildComp As Variant


поступайте так, в будущем :alien:

qwertyhp
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 156
Зарегистрирован: 07.10.2009 (Ср) 15:02
Откуда: Москва

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение qwertyhp » 27.02.2010 (Сб) 18:56

Удалено
Последний раз редактировалось qwertyhp 28.02.2010 (Вс) 0:24, всего редактировалось 2 раз(а).
Пятачок Forever! :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как найти и удалить дубликаты из "List`а(списка)

Сообщение Хакер » 27.02.2010 (Сб) 19:00

ssv22, если ты задаёшь вопросы абстрагируясь от конкретных технологией или программ, то это приветствуется, но мой вопрос был так же абстрагирован: есть ли смыл в поиске в дереве?

И ещё: требую огласить, что считается дубликатами. Для этого нужно ответить на следующие вопросы:
  • Кодировка, в которой хранятся имена элементов
  • Регистрозависимость сравнения
  • Учитываем национальные особенности языка при сравнении (ss=ß)?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 6

    TopList