Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Пркобразование массива / 18 сообщений из 18, страница 1 из 1
14.02.2005, 06:43:08
    #32913595
Sergey_New
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пркобразование массива
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Есть массив строк:

Номер 	ID	Date
строки
 1 	 1 	[данные]
 2 	 1 	[данные]
 3 	 2 	[данные]
 4 	 3 	[данные]
 5 	 4 	[данные]
 6 	 3 	[данные]
 7 	 2 	[данные]
 8 	 1 	[данные]
...
Изменение ID означает, что данные строки явлются дополняющими к данным ближайшей предыдущей строки 
с ID меньшим на единицу текущего.
Данные  3 -ей строки дополняют данные  2 -ой строки.
Данные  4 -ой строки дополняют данные  3 -ей строки.
Данные  5 -ой строки дополняют данные  4 -ой строки.
Данные  6 -ой строки дополняют данные  3 -ей строки.
Данные  7 -ой строки дополняют данные  2 -ой строки.
Требуется преобразовать массив к виду:

Номер 	ID	Date	Уровень  2 	Уровень  3 	Уровень  4 
строки
 1 	 1 	[данные]			
 2 	 1 	[данные]			
			 2  [данные]		
				 3  [данные]	
					 4  [данные]
				 3  [данные]	
			 2  [данные]		
 3 	 1 	[данные]			
Число уровней и строк м.б. неограниченным.
Если возможно, подскажите решение, чтобы выбрав нужную строку, прочитать все относящиеся к ней данные.
...
Рейтинг: 0 / 0
14.02.2005, 10:43:59
    #32913879
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пркобразование массива
ну примерно так хотя и не буду утверждать ;-)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
dim iLevel as integer
dim i as integer
dim arr1( 1 .. 100 ) as date

iLevel =  1 
'бежим по массиву
for i =  1  to ucase(arr)
  ' если поле  ID = заданной строке
  if arr(i, 2 ) = заданнаяСтрока then
    'делаем то, что надо
    arr1(iLevel) = arr(i, 3 )
    'увеличиваем уровень вложенности (дополнения)
    iLevel = iLevel +  1 
  endif
next i
...
Рейтинг: 0 / 0
14.02.2005, 10:49:14
    #32913890
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пркобразование массива
создать вспомогательный (индексный) массив номеров строк, отсортированный по ID aInd(). Назовём исходный массив aVal().
результат = Сборка_строки(Num)
Sub Сборка_строки(Num) as String
ID = aVal(Num).ID
n = двоичным поиском в индексном массиве находим первый ID
Сборка_строки = Сборка_строки & aVal(Num).Str
Do While aInd(n).ID = ID
'перечисляем все позиции с тем же ID и рекурсивно собираем подстроки
Сборка_строки = Сборка_строки & Сборка_строки(aInd(n).Num)
n = n+1
Loop
End Sub

В общем как то так.
...
Рейтинг: 0 / 0
14.02.2005, 12:45:18
    #32914231
Sergey_New
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пркобразование массива
To marvan
Не совсем разобрался в предложенном решении, но в нем нет привязки подстроки к "родителю".
...
Рейтинг: 0 / 0
14.02.2005, 15:12:40
    #32914453
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пркобразование массива
нет привязки подстроки к "родителю".
предложенный мой способ собирает строку начиная с указанного номера.
этот номер по сути и является предком.
Вполне может быть, что что то упущено, но суть неизменна - лучше использовать рекурсивный алгоритм.
...
Рейтинг: 0 / 0
14.02.2005, 15:58:25
    #32914581
Sergey_New
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пркобразование массива
То marvan
В подстроке может быть несколько вложенных предков.
В первом посте они показаны.
Как их определить?
...
Рейтинг: 0 / 0
14.02.2005, 16:47:28
    #32914768
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пркобразование массива
Может закрыть топик, чтобы в почту всякая пакость не падала?
...
Рейтинг: 0 / 0
14.02.2005, 16:49:49
    #32914774
Гео
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пркобразование массива
Вру, это уже не у нас на форуме. Придется Магнуса просить :))
...
Рейтинг: 0 / 0
14.02.2005, 16:52:26
    #32914781
Владимир Саныч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пркобразование массива
for i=1 to ubound(arr)
if i=1 then
arr(i).level=0
else
arr(i).level=arr(arr(i).ID).level+1
endif
next

где arr(i).level - еще одно поле структуры, из объектов которой состоит массив. И потом:

for i=1 to ubound(arr)
print string(arr(i).level, chr(9)) & ...
next
...
Рейтинг: 0 / 0
14.02.2005, 16:53:20
    #32914784
Владимир Саныч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пркобразование массива
GeoМожет закрыть топик, чтобы в почту всякая пакость не падала?
Закрытие топика не спасает от сообщений модератору.
...
Рейтинг: 0 / 0
14.02.2005, 18:03:48
    #32914977
Sergey_New
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пркобразование массива
Владимир Саныч, спасибо! Буду пробовать.

То Geo, гео:
Злые вы, уйду я от вас! :)
...
Рейтинг: 0 / 0
14.02.2005, 19:13:18
    #32915126
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пркобразование массива
От меня можешь не уходить, я уже фильтр настроил
Так что продолжай стучать.
...
Рейтинг: 0 / 0
14.02.2005, 21:30:48
    #32915245
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пркобразование массива
Похоже у вас древовидная структура.
И поле ID выполняет функцию Prent_ID.
Если так, то работают с такими данными используя рекурсивные алгоритмы.
Уточняющий вопрос:

Как надо представить полученные (в случае успешного ответа на вопрос) данные?
В виде массива - "веточки"?
...
Рейтинг: 0 / 0
14.02.2005, 22:22:32
    #32915261
Sergey_New
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пркобразование массива
То Worobjoff
Вы правильно предположили про Parent_ID.
И данные нужно получить в виде вложенных массивов.

То Владимир Саныч
Мне кажется, что предложенное решение не учитывает уменьшение ID (строка 7 примера).

То Лох Позорный
Чем не угодил?
...
Рейтинг: 0 / 0
14.02.2005, 22:52:51
    #32915271
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пркобразование массива
Реализовал вашу задачу с помощью синтетического рекордсета (может подойдет)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
Dim rs As ADODB.Recordset ' Массив данных
Dim rs2 As ADODB.Recordset 'Возвращает ветвь
Private Sub Command1_Click()
   Dim i As Long, j As Long
   For i =  0  To  9  'Наполним массив "случайными данными"
      rs.AddNew Array("id", "Parent_id", "Text"), Array(i, j, " Число " & i)
      rs.Update
      If (i Mod  2 ) =  0  Then j = j +  1 
   Next
   Dim s As String
   Call Ветвь( 2 ) 'Найдем всех потомков узла 2
   If rs2.RecordCount >  0  Then rs2.MoveFirst
   Do Until rs2.EOF ' и покажем что нашли
      s = s & rs2.Fields( 0 ).Value & " " & rs2.Fields( 1 ).Value & rs2.Fields( 2 ).Value & vbCrLf
      rs2.MoveNext
   Loop
   MsgBox s
End Sub
Sub Ветвь(ByVal Ключ As Long)
   Dim k As Long
   If Not rs.EOF Then rs.MoveFirst
   rs.Find "Parent_id = " & Ключ
   Do Until rs.EOF
      k = rs.AbsolutePosition 'Запоминаем текущую позицию
      rs2.AddNew Array("id", "Parent_id", "Text"), Array(rs.Fields( 0 ), rs.Fields( 1 ), rs.Fields( 2 ))
      Call Ветвь(rs.Fields("id"))
      rs.MoveFirst
      rs.Move k +  1   'Восстанавливаем позицию (+1)
      rs.Find "Parent_id = " & Ключ
   Loop
End Sub
Private Sub Form_Load() 'инициализация
   'Основной массив
   Set rs = New ADODB.Recordset
   rs.Fields.Append "id", adInteger, , adFldKeyColumn
   rs.Fields.Append "Parent_id", adInteger
   rs.Fields.Append "Text", adVarChar,  20 
   rs.Open , , adOpenStatic, adLockBatchOptimistic
   'Для возвращаемых значений
   Set rs2 = New ADODB.Recordset
   rs2.Fields.Append "id", adInteger, , adFldKeyColumn
   rs2.Fields.Append "Parent_id", adInteger
   rs2.Fields.Append "Text", adVarChar,  20 
   rs2.Open , , adOpenStatic, adLockBatchOptimistic
End Sub
Пример рекурсии понять по примеру можно.
Хотя доработать придется. Например надо "сбрасывать" rs2 перед вызвом и т.п.
...
Рейтинг: 0 / 0
14.02.2005, 23:56:11
    #32915296
Владимир Саныч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пркобразование массива
Sergey_NewТо Владимир Саныч
Мне кажется, что предложенное решение не учитывает уменьшение ID (строка 7 примера).
Не могу сообразить, надо попробовать.

Sergey_NewТо Лох Позорный
Чем не угодил?
Рассылкой спама. Кстати, и мне тоже.
...
Рейтинг: 0 / 0
15.02.2005, 07:12:06
    #32915446
Sergey_New
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пркобразование массива
Владимир Саныч:
авторРассылкой спама. Кстати, и мне тоже.
А как попал спам?
Я только прибег к помощи "Сообщить модератору" на форуме.
Это что, запрещено?
В любом случае, прошу прощения за доставленное неудобство!

То Worobjoff
Спасибо! Буду пробовать.
...
Рейтинг: 0 / 0
15.02.2005, 11:24:37
    #32915913
Владимир Саныч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пркобразование массива
Sergey_NewА как попал спам?
Я только прибег к помощи "Сообщить модератору" на форуме.
Это что, запрещено?
Это сообщение модератору разослало всем модераторам Аксесса жалобу на меня. Оно для этого предназначено.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Пркобразование массива / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]