解析包含树结构定界符的字符串列表

时间:2019-03-20 00:59:02

标签: c# data-structures tree

所以我有一个像这样的字符串列表:

  

无水饮料= new List(){“饮料”,“ *”,“朗姆酒”,“摩根船长”,“克拉肯”,“ *”,“威士忌”,   “ Laphroaig”}

它需要返回以下内容:

*饮料
*饮料*朗姆酒
*饮料*朗姆酒*摩根船长
*饮料*朗姆酒*海妖
*饮料*威士忌
*饮料*威士忌* Laphroaig

因此可见,每当遇到*时,下一个字符串将被视为根目录下的子代。因此,在这里,朗姆酒将归饮料集团所有,摩根船长和Kraken将归朗姆酒所有。威士忌将归于饮料,而拉弗格则归于威士忌。

我知道它必须是某种树形结构,而我现在唯一拥有的就是:

private static Drink GroupDrinks(List<string> drinkNames)
{
        var drink = new Drink() { Children = new List<Drink>() };
        foreach (var drinkName in drinkNames)
        {
            if (drinkName != "*")
            {
                drink.Name = drinkName;
                drinkNames.RemoveAt(0);
            }
            else
            {
                drinkNames.RemoveAt(0);
                drink.Children.Add(GroupDrinks(drinkNames));
            }
        }
        return drink;
    }  

我认为我需要进行某种递归,也许删除字符,这样它就不会影响下一次迭代,但是显然这是行不通的。任何提示都很棒。

1 个答案:

答案 0 :(得分:0)

我不确定此代码是否对您有用,但已作为您的预期输出进行了测试:

声明:

 List<Drink> lstdrink = new List<Drink>();

        public List<FinalDrink> lstFinalDrink = new List<FinalDrink>();

班级:

public class FinalDrink
        {
            public string name { get; set; }
        }
        public class Drink
        {
            public string name { get; set; }
            public int Tag { get; set; }
        }

设置值:

 public List<Drink> SetUpTheValue()
        {
            var drinks = new List<string> { "Drinks", " * ", "Rum", "Captain Morgan", "Kraken", " * ", "Whiskey", "Laphroaig" };
            var repl = drinks.Select(s => s.Replace('*', ' ')).ToList();
            string tag = string.Empty;
            Drink drk = new Drink();
            lstdrink = new List<Drink>();
            for (int i = 0; i < repl.Count; i++)
            {


                if (i == 0)
                {
                    drk = new Drink();
                    drk.name = repl[i];
                    drk.Tag = 1;
                    lstdrink.Add(drk);
                    tag = repl[i];
                    continue;
                }

                if (tag.Trim().Length == 0)
                {
                    drk = new Drink();
                    drk.name = repl[i];
                    drk.Tag = 2;
                    lstdrink.Add(drk);
                    tag = repl[i];
                    continue;
                }

                if (repl[i].ToString().Trim().Length > 0)
                {
                    drk = new Drink();
                    drk.name = repl[i];
                    drk.Tag = 0;
                    lstdrink.Add(drk);
                    tag = repl[i];
                }

                tag = repl[i];

            }
            return lstdrink;
        }

团体饮料:

public List<FinalDrink> GroupDrinks(List<Drink> drinkNames)
        {

            lstFinalDrink = new List<FinalDrink>();
            FinalDrink fDrink = new FinalDrink();
            var GetFirst = drinkNames.Where(x => x.Tag == 1).ToList();
            fDrink.name = GetFirst[0].name.ToString();
            lstFinalDrink.Add(fDrink);
            var Content = drinkNames.Where(x => x.Tag != 1).ToList();
            string itrVal = string.Empty;
            int prev = 0;
            string hcur = string.Empty;
            for (int i = 0; i < Content.Count(); i++)
            {
                if (Content[i].Tag == 2)
                {
                    hcur = GetFirst[0].name + " * " + Content[i].name;

                    fDrink = new FinalDrink();
                    itrVal = GetFirst[0].name + " * " + Content[i].name;
                    fDrink.name = itrVal;
                    lstFinalDrink.Add(fDrink);
                    prev = Content[i].Tag;
                    itrVal = string.Empty;

                }

                else
                {
                    fDrink = new FinalDrink();
                    itrVal = hcur + " * " + Content[i].name;
                    fDrink.name = itrVal;
                    lstFinalDrink.Add(fDrink);
                    prev = Content[i].Tag;
                    itrVal = string.Empty;
                }
            }

            return lstFinalDrink;
        }

执行:

private void button1_Click(object sender, EventArgs e)
        {
            if (SetUpTheValue().Count() > 0)
            {
                GroupDrinks(lstdrink);
            }
        }

GroupDrinks返回List<FinalDrink>,这是最终结果。

修改结果取决于您

此代码将返回您从上方添加的预期输出。