Я думаю, что самым простым способом было бы выполнить сортировку по алфавиту в исходном списке
Tool: Saw
Fruit: Apple
Fruit: Orange
Tree: Maple
Fruit: Banana
Tree: Oak
Tool: Hammer
Tree: Cedar
Чтобы получить:
Fruit: Apple
Fruit: Banana
Fruit: Orange
Tool: Hammer
Tool: Saw
Tree: Cedar
Tree: Maple
Tree: Oak
Оттуда вы можете легко перебирать массив и форматировать его. Посмотрите на первую часть первой строки и напечатайте ее, затем переведите вторую часть. Посмотрите на вторую строку, если ее первая часть отличается, у вас новый родитель, поэтому печатайте, как вы сделали первую, в противном случае просто напечатайте вторую часть строки. Продолжайте в том же духе.
Вы также можете хранить элементы в дереве, чтобы вместо списка строк в формате «parent: node» у вас было дерево узлов с дочерними элементами. Это даст вам возможность иметь дочерние узлы с детьми и т. Д.
Первый вариант работает, но древовидная структура данных является более надежным вариантом, который было бы проще расширить.
Дайте мне знать, если это не имеет смысла, и я уточню, чтобы уточнить.