从数组中复杂删除组中重复的元素

时间:2020-04-15 08:21:58

标签: arrays ruby unique-values

我有以下输入数据,我想删除每个组和每个子组中的重复元素(将所有字符串以相同的出现顺序保留)。在这种情况下,组以与s5相关的字符串开头 所有内容均位于“第一章”之下,而下一组开始于“第二章”的首次出现。每个组中可以是与s4相关的子组。例如“第一部分”, “简介”,“第二部分”等

输入类似于左侧的列。第二列是说明,显示了组中以及组/子组中每个字符串的出现。第三列是预期的输出,第四列是我当前得到的输出。

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

enter image description here

这是我当前的代码,其中的逻辑看起来是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  |                       |

1 个答案:

答案 0 :(得分:1)

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

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

但是实际上,您的代码当前正在忽略父母。它正在调用b.uniq,它将仅查看该元素的文本表示形式,例如“ s3 >> Arcticle 1”。您会看到“ s3 >> Arcticle 1”没有有关父元素的信息;是第4行还是第12行的“ s3 >> Arcticle 1”?第4行上的一个具有称为“ s4 >> FIRST PART”的父级,而第12行上的一个具有名为“ s4 >> SECOND PART”的父级。

要了解我在说什么,请在致电b.uniq之前停下来,然后打印出b的全部内容。您会看到b中的每个元素都没有父信息。父信息位于b的另一个元素中,但是b中目前没有任何内容可以将元素与作为父元素的其他元素联系在一起。

要做的是,遍历每个元素,看看是否还有其他相同的元素,并且在每个级别上都有相同的父母。如果是这样,则该元素将真正是要删除的重复项。

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

我建议从ClassesStructs开始的潜在数据结构。当然,还有其他方法可以解决此问题,但希望这会开始。

相关问题