Комплексное удаление повторяющихся элементов в группах из массива - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть следующие входные данные, для которых я хотел бы удалить повторяющиеся элементы (оставляя все строки в том же порядке появления) в каждой группе и каждой подгруппе. Группа начинается со строки, которая имеет отношение s5, в данном случае все ниже «ПЕРВАЯ ГЛАВА», а следующая группа начинается с первого появления «ВТОРАЯ ГЛАВА». Внутри каждой группы могут быть подгруппы, связанные с s4. Например, «ПЕРВАЯ ЧАСТЬ», «ВВЕДЕНИЕ», «ВТОРАЯ ЧАСТЬ» и т. Д. c.

Входные данные имеют вид столбца слева. Второй столбец - это объяснение, которое показывает вхождения каждой строки в группе и в группе / подгруппе. 3-й столбец - это ожидаемый результат, а 4-й столбец - это вывод, который я получаю в настоящее время.

Я выделил желтым цветом первое появление каждой строки, чтобы лучше показать, какие элементы следует печатать при выводе. Те, которые выделены желтым цветом, являются первыми в их соответствующей группе / подгруппе, и, удалив все строки белым цветом, мы получим правильный вывод. Я надеюсь, что имеет смысл.

enter image description here

Это мой текущий код, где logi c ищет уникальные значения. Вывод аналогичен, но не верен, так как значения uniq сравниваются с целым массивом, а не с каждой группой.

a=<<_
s5>>FIRST CHAPTER
s4>>FIRST PART
s4>>INTRODUCTION
s3>>Article 1
s5>>FIRST CHAPTER
s4>>FIRST PART
s4>>INTRODUCTION
s3>>Article 2
s5>>FIRST CHAPTER
s4>>SECOND PART
s4>>REVIEW
s3>>Article 1
s5>>FIRST CHAPTER
s4>>SECOND PART
s4>>METHODOLOGY
s3>>Article1
s5>>SECOND CHAPTER
s4>>FIRST PART
s4>>INTRODUCTION
s3>>First section
s5>>SECOND CHAPTER
s4>>FIRST PART
s4>>INTRODUCTION
s3>>Second Section
_

b = a.split("\n")
c = b.uniq

puts c

Может кто-нибудь помочь мне в том, как это сделать. Спасибо

Вход и выход ниже

| Input                 | Output                |
|---------------------- |--------------------   |
| s5>>FIRST   CHAPTER   | s5>>FIRST CHAPTER     |
| s4>>FIRST   PART      | s4>>FIRST PART        |
| s4>>INTRODUCTION      | s4>>INTRODUCTION      |
| s3>>Arcticle   1      | s3>>Arcticle 1        |
| s5>>FIRST   CHAPTER   | s3>>Arcticle 2        |
| s4>>FIRST   PART      | s4>>SECOND PART       |
| s4>>INTRODUCTION      | s4>>REVIEW            |
| s3>>Arcticle   2      | s3>>Arcticle 1        |
| s5>>FIRST   CHAPTER   | s4>>METHODOLOGY       |
| s4>>SECOND   PART     | s3>>Arcticle1         |
| s4>>REVIEW            | s5>>SECOND CHAPTER    |
| s3>>Arcticle   1      | s4>>FIRST PART        |
| s5>>FIRST   CHAPTER   | s4>>INTRODUCTION      |
| s4>>SECOND   PART     | s3>>First section     |
| s4>>METHODOLOGY       | s3>>Second Section    |
| s3>>Arcticle1         |                       |
| s5>>SECOND   CHAPTER  |                       |
| s4>>FIRST   PART      |                       |
| s4>>INTRODUCTION      |                       |
| s3>>First   section   |                       |
| s5>>SECOND   CHAPTER  |                       |
| s4>>FIRST   PART      |                       |
| s4>>INTRODUCTION      |                       |
| s3>>Second   Section  |                       |

1 Ответ

1 голос
/ 18 апреля 2020

Я бы подошел к этой проблеме, посмотрев на все родительские элементы, для каждого элемента.

Рассмотрим элемент с именем 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 существует множество способов сделать это. Я бы предложил начать с рассмотрения структуры данных, которую вы можете написать в коде, которая бы полностью представляла каждый элемент и его родителей. Таким образом, структуры данных можно сравнивать друг с другом и удалять дубликаты.

Потенциальные структуры данных, которые я бы рекомендовал начать с Классы и Структуры . Конечно, есть и другие способы приблизиться к этому, но, надеюсь, с этого все и начнется.

...