0

我有以下输入数据,我想删除每个组和每个子组中的重复元素(使所有字符串保持相同的出现顺序)。一个组以一个有相关的字符串开始s5,在这种情况下都在“FIRST CHAPTER”之下,下一个组从“SECOND CHAPTER”的第一次出现开始。每个组内可以是与 相关的子组s4。例如“第一部分”、“介绍”、“第二部分”等。

输入就像左边的列。第二列是显示组内和组/子组内每个字符串出现次数的说明。第 3 列是预期输出,第 4 列是我目前得到的输出。

我用黄色突出显示了每个字符串的第一次出现,以便更好地向您展示应该在输出中打印哪些元素。黄色的那些是它们各自组/子组中的第一次出现,并删除所有白色的行,我们得到正确的输出。我希望有意义。

在此处输入图像描述

这是我当前的代码,其中逻辑看起来是 uniq 值。输出相似但不正确,因为将 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  |                       |
4

1 回答 1

1

我会通过查看每个元素的所有父元素来解决这个问题。

考虑一个名为 [sic] 的元素s3>>Arcticle 1,它位于图表顶部的第 4 位。要查找重复项,仅查看所有其他 s3 级元素是不够的。其中一些其他 s3 级元素具有不同的父级。例如,第 12 行的 s3-level 元素具有不同的 s4-level 不同的父级。

但实际上,您的代码目前正在忽略父母。它正在调用b.uniq,它只会查看该元素的文本表示,例如“s3>>Arcticle 1”。“s3>>Arcticle 1”没有关于父元素的信息,你看;是第 4 行还是第 12 行的“s3>>第 1 条”?第 4 行的父节点名为“s4>>FIRST PART”,而第 12 行的父节点名为“s4>>SECOND PART”。

要了解我在说什么,请在打电话之前停下来b.uniq,并打印出b. 您会看到其中的每个元素b都没有父信息。父信息在 中的另一个元素中b,但b当前没有任何东西可以将元素与作为其父元素的其他元素联系在一起。

需要做的是遍历每个元素,看看是否有其他元素相同,以及每个级别是否有相同的父级。如果是这样,该元素将确实是要删除的重复项。

在 Ruby 中,有很多方法可以做到这一点。我建议从考虑可以在代码中编写的数据结构开始,这将完全代表每个元素及其父元素。这样,数据结构可以相互比较,并删除重复项。

我推荐的潜在数据结构是ClassesStructs。当然还有其他方法可以解决这个问题,但希望这会让事情开始。

于 2020-04-18T01:40:07.817 回答