【发布时间】: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 Morgan和Kraken是兄弟姐妹而不是父/子? -
这是一个分隔符。任何时候遇到这种情况,下一行都会在根目录下,而后面的字符串将作为子字符串落在前一行之下。所以在这个例子中,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