【问题标题】:Parsing list of string containing a delimiter to tree structure解析包含树结构分隔符的字符串列表
【发布时间】:2019-03-20 00:59:01
【问题描述】:

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

var Drinks = new List(){"Drinks", "*", "Rum", "Captain Morgan", "Kraken", "*", "Whiskey", “拉弗格”}

它需要返回以下内容:

*饮料
*饮料*朗姆酒
*饮料 * 朗姆酒 * 摩根船长
*饮料 * 朗姆酒 * 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;
    }  

我认为我需要进行某种递归,并且可能会删除角色,这样它就不会影响下一次迭代,但这显然不起作用。任何提示都会很棒。

【问题讨论】:

  • *的作用是什么?
  • 我建议在开始编写代码解析树之前花更多时间定义如何定义树。如何确定Captain MorganKraken 是兄弟姐妹而不是父/子?
  • 这是一个分隔符。任何时候遇到这种情况,下一行都会在根目录下,而后面的字符串将作为子字符串落在前一行之下。所以在这个例子中,Rum 属于 Drinks,Captain Morgan 和 Kraken 属于 Rum。遇到另一个 *,因此 Whiskey 属于 Drinks,而 Laphroaig 属于 Whiskey。我会更新问题以获得更多说明
  • 你在 C# 而不是 json,这不是字符串列表 ["Drinks", " * ", "Rum", "Captain Morgan", "Kraken", " * ", "Whiskey", "Laphroaig"] 但是这可能是 var list = new List(){"Drinks", " * ", "Rum", "Captain Morgan", "Kraken", " * ", "Whiskey", "Laphroaig"}
  • “Drinks”之前不应该也有一个星号,否则我们肯定知道它是根。一种快速的方法是在“*”上拆分列表,并将其后面的第一个字符串作为子根,并在该子节点下添加该拆分列表中的其余项目。假设所有级别都显示在上面的例子。

标签: c# data-structures tree


【解决方案1】:

我不确定此代码是否适合您,但它已作为您的预期输出进行测试:

声明:

 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&lt;FinalDrink&gt; 这是最终结果。

结果取决于你自己修改

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

【讨论】:

    猜你喜欢
    • 2014-07-12
    • 1970-01-01
    • 2013-05-31
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    相关资源
    最近更新 更多