在嵌套集中排序

问题描述 投票:0回答:1
Parent 1
 |
 |-Child 1
 |- - Child 1_GrandChild1
 |
 |-Child 2
 |
Parent 2
 |
 |-Child 1
 |- - Child 1_GrandChild1
 |- - Child 1_GrandChild2
 |
 |-Child 2
 |
 |-Child 3
 |- - Child 3_GrandChild1
 |
Parent 3

我想按字母顺序对这个嵌套集结构进行排序,应该首先对父母进行排序,然后对孩子和孙子进行排序。

这已经在超棒的嵌套镶嵌宝石中实现,但是它并没有给我孙子按照排序的顺序,只有父母按照排序的顺序。我也尝试在模型部分中使用order_column属性,但得到的结果相同-父母已排序,但孙子未排序。我也检查了提到的herehere问题,但没有帮助。我们如何解决这个问题?

编辑:所以它是一个对象数组。

输入:

A
 - C
 - B

Output:

A
 - B
 - C

问题是,如果我有孙子代,则现有的实现无法对其进行排序。

ruby-on-rails ruby data-structures rubygems ruby-on-rails-5
1个回答
0
投票

我真的不知道您是否在寻找以下内容,但是如果不是,您可以根据需要进行调整。

str =<<~END
Parent 1
 |
 |-Child 1
 |- - Child 1_GrandChild1
 |
 |-Child 2
 |
Parent 2
 |
 |-Child 1
 |- - Child 1_GrandChild1
 |- - Child 1_GrandChild2
 |
 |-Child 2
 |
 |-Child 3
 |- - Child 3_GrandChild1
 |
Parent 3
END

str.each_line.with_object([]) do |s,arr|
  s.chomp!
  case s
  when /\A\p{Alpha}+\s+\d+\z/
    arr << [0,s]
  when /\A \|\-\p{Alpha}+\s+\d+\z/
    arr << [1,s[/[A-Z].*/]]
  when /\A \|\- \- \p{Alpha}+ \d+\_\p{Alpha}+\d+\z/
    arr << [2,s[/\d.*/]]
  end
end.sort.map(&:last)
  #=> ["Parent 1", "Parent 2", "Parent 3", "Child 1", "Child 1", "Child 2",
  #    "Child 2", "Child 3", "1_GrandChild1", "1_GrandChild1", "1_GrandChild2",
  #    "3_GrandChild1"]

请注意

a = str.each_line.with_object([]) do |s,arr|
  s.chomp!
  case s
  when /\A\p{Alpha}+\s+\d+\z/
    arr << [0,s]
  when /\A \|\-\p{Alpha}+\s+\d+\z/
    arr << [1,s[/[A-Z].*/]]
  when /\A \|\- \- \p{Alpha}+ \d+\_\p{Alpha}+\d+\z/
    arr << [2,s[/\d.*/]]
  end
end
  #=> [[0, "Parent 1"], [1, "Child 1"], [2, "1_GrandChild1"],
  #    [1, "Child 2"], [0, "Parent 2"], [1, "Child 1"],
  #    [2, "1_GrandChild1"], [2, "1_GrandChild2"], [1, "Child 2"],
  #    [1, "Child 3"], [2, "3_GrandChild1"], [0, "Parent 3"]]

因此,sort首先对每个两个元素数组的第一个元素进行排序,然后对第二个元素进行排序以打破束缚:

b = a.sort
  #=> [[0, "Parent 1"], [0, "Parent 2"], [0, "Parent 3"],
  #    [1, "Child 1"], [1, "Child 1"], [1, "Child 2"], [1, "Child 2"],
  #    [1, "Child 3"],
  #    [2, "1_GrandChild1"], [2, "1_GrandChild1"], [2, "1_GrandChild2"],
  #    [2, "3_GrandChild1"]] 

最后,b.map(&:last)将这两个元素的数组分别映射到数组的最后一个元素。

© www.soinside.com 2019 - 2024. All rights reserved.