zoukankan      html  css  js  c++  java
  • 用迭代实现无限级分类

    说起那个无限级分类,相信很多人都知道是什么东西,也曾经做过。我也相信,大家用得最多的实现方式就是做一个递归。

    最近我也要做一个带无限级分类的菜单,但是我又不想用递归来做,所以我需要用其他方式来实现,那就是迭代了。

    首先,我需要定义一个实体模型,这举一个省市无限级的例子:

        class Loaction
        {
            public int ID { get; set; }
            public int PID { get; set; }
            public string Name { get; set; }    //地方名
            public int Level { get; set; }      //深度
        }

    然后写方法,这里需要利用到栈的后进先出的特点:

            public static List<Loaction> Soft(List<Loaction> data, int pid)
            {
                Stack task = new Stack();
                task.Push(pid);
                List<Loaction> tree = new List<Loaction>();
                int level = 0;
                while (task.Count > 0)
                {
                    bool flag = false;
                    for (int i = 0; i < data.Count; i++)
                    {
                        var l = data[i];
                        if (l.PID == pid)
                        {
                            pid = l.ID;
                            task.Push(l.ID);
                            l.Level = level;
                            level++;
                            tree.Add(l);
                            data.Remove(l);
                            i--;
                            flag=true;
                        }
                    }
                    if (!flag)
                    {
                        task.Pop();
                        if (task.Count > 0)
                        {
                            pid = Convert.ToInt32(task.Peek());
                            level--;
                        }
                    }
                }
                return tree;
            }

    最后准备数据->调用->输出:

            static void Main(string[] args)
            {
                var data = new List<Loaction>();
                data.Add(new Loaction() { ID = 1, PID = 0, Name = "北京" });
                data.Add(new Loaction() { ID = 2, PID = 0, Name = "广东" });
                data.Add(new Loaction() { ID = 3, PID = 0, Name = "上海" });
                data.Add(new Loaction() { ID = 4, PID = 0, Name = "重庆" });
                data.Add(new Loaction() { ID = 5, PID = 0, Name = "黑龙江" });
                data.Add(new Loaction() { ID = 6, PID = 1, Name = "丰台" });
                data.Add(new Loaction() { ID = 7, PID = 1, Name = "海淀" });
                data.Add(new Loaction() { ID = 8, PID = 1, Name = "石景山" });
                data.Add(new Loaction() { ID = 9, PID = 3, Name = "上海市" });
                data.Add(new Loaction() { ID = 10, PID = 2, Name = "广州" });
                data.Add(new Loaction() { ID = 11, PID = 5, Name = "齐齐哈尔" });
                data.Add(new Loaction() { ID = 12, PID = 2, Name = "茂名" });
                data.Add(new Loaction() { ID = 13, PID = 2, Name = "深圳" });
                data.Add(new Loaction() { ID = 14, PID = 5, Name = "哈尔滨" });
                data.Add(new Loaction() { ID = 15, PID = 4, Name = "重庆市" });
                data.Add(new Loaction() { ID = 16, PID = 2, Name = "东莞" });
                data.Add(new Loaction() { ID = 17, PID = 2, Name = "中山" });
                data.Add(new Loaction() { ID = 18, PID = 16, Name = "厚街镇" });
    
                var tree = Soft(data, 0);
    
                foreach (var t in tree)
                {
                    var sb = new StringBuilder();
                    for (int i = 0; i < t.Level; i++)
                    {
                        sb.Append("  ");
                       
                    } 
                    sb.Append(t.Name);
                    Console.WriteLine(sb.ToString());
                }
                Console.ReadKey();
            }

    然后效果如下:

    就是这个样子。。。。。(END)

  • 相关阅读:
    HDU 1455 http://acm.hdu.edu.cn/showproblem.php?pid=1455
    UVA 11300 Spreading the Wealth
    HDU 1702 http://acm.hdu.edu.cn/showproblem.php?pid=1702
    栈的简单应用 HDU 1022 http://acm.hdu.edu.cn/showproblem.php?pid=1022
    HDU 1702 队列与栈的简单运用http://acm.hdu.edu.cn/showproblem.php?pid=1702
    背包模板(01背包,完全背包,多重背包)
    XSS内容拓展--伪造你的IP
    Linux文件系统
    2015阿里校招研发工程师笔试题
    鸟哥的私房菜复习一
  • 原文地址:https://www.cnblogs.com/xiaodiejinghong/p/3621891.html
Copyright © 2011-2022 走看看