Я бы подошел к этой проблеме, посмотрев на все родительские элементы, для каждого элемента.
Рассмотрим элемент с именем s3>>Arcticle 1
[sic], который является четвертым сверху на вашей диаграмме. Чтобы найти дубликаты, недостаточно взглянуть на все остальные элементы уровня s3. Некоторые из этих других элементов уровня s3 имеют разных родителей. Например, элемент уровня s3 в строке 12 имеет другого родителя другого уровня s4.
Но на самом деле ваш код в настоящее время игнорирует родителей. Он вызывает b.uniq
, который будет смотреть только на текстовое представление этого элемента, например "s3 >> Arcticle 1". "s3 >> Arcticle 1" не имеет информации о родительских элементах; это "s3 >> Arcticle 1" в строке 4 или в строке 12? У одного в строке 4 есть родительский элемент с именем «s4 >> FIRST PART», в то время как у другого в строке 12 есть родительский элемент с именем «s4 >> SECOND PART».
Чтобы понять, о чем я говорю, остановитесь, прежде чем позвонить b.uniq
, и распечатайте все содержимое b
. Вы увидите, что каждый элемент в b
не имеет родительской информации. Информация о родительском элементе находится в другом элементе в b
, но в b
в настоящее время нет ничего для t ie элементов вместе с другими элементами, являющимися их родителями.
Что необходимо сделать, так это go через каждый элемент и посмотрите, есть ли другие элементы, которые одинаковы, а также имеют одинаковых родителей на каждом уровне . Если это так, этот элемент действительно будет дубликатом, который нужно удалить.
В Ruby существует множество способов сделать это. Я бы предложил начать с рассмотрения структуры данных, которую вы можете написать в коде, которая бы полностью представляла каждый элемент и его родителей. Таким образом, структуры данных можно сравнивать друг с другом и удалять дубликаты.
Потенциальные структуры данных, которые я бы рекомендовал начать с Классы и Структуры . Конечно, есть и другие способы приблизиться к этому, но, надеюсь, с этого все и начнется.