Задача на сортировку (С#)
Всем Привет,
Что-то последние неск часов залип с следующей задачей.
Есть код на шарпе, который должен отсортировать это список примерно в том виде в котором он уже есть. Визуально можно оценить принцип сортировки этих строк, каждая из которых представляет путь в дереве, а в квадратных скобках индекс в коллекции.
class Program
{
private static string str =
@"Aaa
Bbb
Cccc
Comments\[0]\Aaa
Comments\[0]\Bbb
Comments\[0]\Array\[0]
Comments\[0]\Array\[1]
Comments\[0]\Array\[4]
Comments\[0]\Array\[4]
Comments\[0]\Childs\[0]\Aaa
Comments\[0]\Childs\[0]\Bbb
Comments\[0]\Childs\[0]\Likes\[0]
Comments\[0]\Childs\[0]\Likes\[4]
Comments\[0]\Childs\[0]\Likes\[4]
Comments\[0]\Childs\[1]\Aaa
Comments\[0]\Childs\[1]\Bbb
Comments\[0]\Childs\[1]\Likes\[0]
Comments\[0]\Childs\[1]\Likes\[4]
Comments\[0]\Childs\[1]\Likes\[4]
Comments\[0]\Childs\[4]
Comments\[0]\Childs\[4]
Comments\[4]
Comments\[4]";
static int CompareTo(string x, string y)
{
var attr1 = x.Split('\\');
var attr2 = y.Split('\\');
//compare by path
var countPath1 = attr1.Length;
var countPath2 = attr2.Length;
var minCountPath = Math.Min(countPath1, countPath2);
for (ushort i = 0; i < minCountPath; i++)
{
var pathName1 = attr1[i];
var pathName2 = attr2[i];
if (pathName1 != pathName2)
{
return pathName1.CompareTo(pathName2);
}
}
return 0;
}
static void Main(string[] args)
{
var list = str.Split('\n', StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Trim())
.ToList();
list.Sort((x, y) => CompareTo(x, y));
var newStr = string.Join('\n', list);
Console.WriteLine(newStr);
}
}
Запускаю этот код и он выдает сортировку вида. Два элемента на неправильном месте. Сначала должни идти более короткие имена, потом более длинные
Aaa
Bbb
Cccc
Comments\[0]\Aaa
Comments\[0]\Array\[0]
Comments\[0]\Array\[1]
Comments\[0]\Array\[4]
Comments\[0]\Array\[4]
Comments\[0]\Bbb
Comments\[0]\Childs\[0]\Aaa
Comments\[0]\Childs\[0]\Bbb
Comments\[0]\Childs\[0]\Likes\[0]
Comments\[0]\Childs\[0]\Likes\[4]
Comments\[0]\Childs\[0]\Likes\[4]
Comments\[0]\Childs\[1]\Aaa
Comments\[0]\Childs\[1]\Bbb
Comments\[0]\Childs\[1]\Likes\[0]
Comments\[0]\Childs\[1]\Likes\[4]
Comments\[0]\Childs\[1]\Likes\[4]
Comments\[0]\Childs\[4]
Comments\[0]\Childs\[4]
Comments\[4]
Comments\[4]
Понятно, что самый очевидный способ отсортировать, это строить полноценное дерево с нодами и постепенно в него вставлять элементы, а потом обходить это дерево. Но не хочется набирать много кода. Неужели нельзя модифицировать int CompareTo(string x, string y) ф-цию чтобы она дала правильный вид сортировки ?
63 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів