Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.09.2016, 11:51
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию Алгоритм построения дерева

Имеем таблицу следующего вида(Materialized Path):

ItemIndex ItemValue

3000000 Item3
1002000 Item1 SubItem2
2000000 Item2
3001000 Item3 SubItem1
3001001 Item3 SubItem1 SubItem1
2001000 Item2 SubItem1
1000000 Item1
3001002 Item3 SubItem1 SubItem2
1001000 Item1 SubItem1

Подскажите пожалуйста, как построить дерево TreeView.

Пришел к результату самостоятельно, кому интересно - код ниже

Код быстрой сортировки:

Код:
int partition<T>(T[] m, int a, int b) where T : IComparable<T>
        {
            int i = a;
            for (int j = a; j <= b; j++)         // просматриваем с a по b
            {
                if (m[j].CompareTo(m[b]) <= 0)  // если элемент m[j] не превосходит m[b],
                {
                    T t = m[i];                  // меняем местами m[j] и m[a], m[a+1], m[a+2] и так далее...
                    m[i] = m[j];                 // то есть переносим элементы меньшие m[b] в начало,
                    m[j] = t;                    // а затем и сам m[b] «сверху»
                    i++;                         // таким образом последний обмен: m[b] и m[i], после чего i++
                }
            }
            return i - 1;                        // в индексе i хранится <новая позиция элемента m[b]> + 1
        }

        void quicksort<T>(T[] m, int a, int b) where T : IComparable<T>// a - начало подмножества, b - конец
        {                                        // для первого вызова: a = 0, b = <элементов в массиве> - 1
            if (a >= b) return;
            int c = partition(m, a, b);
            quicksort(m, a, c - 1);
            quicksort(m, c + 1, b);
        }

И сам код:

Код:
int[] list = new int[] { 1000000, 2000000, 2001000, 3000000, 1001000, 1002000, 3001000, 3002045 };

            //quick sort
            quicksort<int>(list, 0, list.Length - 1);

            var l_max = 0;

            List<List<int>> arrTable = new List<List<int>>();

            foreach (var item in list)
            {
                var num = item;
                var num_str = num.ToString();
                var num_str_l = num_str.Length;
                if (num_str_l > l_max) l_max = num_str_l; //find max length

                double d = num_str_l / 3;

                var k = Convert.ToInt32(Math.Round(d, 0));
                var t = Convert.ToInt32(Math.Pow(1000, k));

                List<int> after = new List<int>();//числа по группам

                var rnd = 0;
                var last_num = 0;

                for (var i = 0; i <= k; i++)
                {
                    num -= last_num;//вычитаем предыдущее значение из текущего пр. 16 320 025 - 16 000 000
                    rnd = num / t; //получаем число группы пр. 16 / 320 / 25
                    after.Add(rnd);
                    last_num = rnd * t; // записываем число в качестве последнего 16 * 1 000 000
                    t /= 1000; //уменьшаем разрядность
                }

                //добавляем в таблицу
                var arrRow = new List<int>();

                //add cols
                for (int j = 0; j < k + 1; j++) arrRow.Add(after[j]);

                arrTable.Add(arrRow);

            }

            TreeNode lastRootNode = null;
            List<int> lastRow = null;

            for (var i = 0; i < arrTable.Count; i++)
            {
                var row = arrTable[i];
                if (lastRow != null) 
                {
                    for (var j = 0; j < row.Count; j++)
                    {
                        if (row[j] != 0 && row[j] != lastRow[j])
                        {
                            TreeNode levelNode = lastRootNode;
                            for (var z = 0; z < j - 1; z++) levelNode = levelNode.LastNode; 
                            if (j > 0) levelNode.Nodes.Add(row[j].ToString());
                            else lastRootNode = tree.Nodes.Add(row[j].ToString());
                        }
                    }
                }
                else
                {
                    TreeNode tn = null;
                    for (var j = 0; j < row.Count; j++) 
                    {
                        if (row[j] != 0) {
                            TreeNode newNode = new TreeNode(row[j].ToString());
                            if (tn == null)
                            {
                                tree.Nodes.Add(newNode);
                                lastRootNode = newNode;
                            }
                            else tn.Nodes.Add(newNode);
                            tn = newNode;
                        }
                    }                    
                }
                lastRow = row;
            }

Последний раз редактировалось Кодер, 29.09.2016 в 16:08.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:38.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter