【问题标题】:Sorting in nested set在嵌套集中排序
【发布时间】:2020-06-28 00:49:14
【问题描述】:
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

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

这已经在 Rails 中很棒的嵌套 set gem 中实现了,但是它没有按排序顺序给我孙子,只有父母是按排序的。 我还尝试在模型部分使用 order_column 属性,但得到了相同的结果——父母被排序,但孙子没有。 我还检查了herehere 提到的问题,但没有任何帮助。 我们该如何解决这个问题?

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

输入:

A
 - C
 - B

Output:

A
 - B
 - C

问题是如果我有孙子,现有的实现不会对其进行排序。

【问题讨论】:

  • 你如何在代码中表示这个数据结构?请举例说明它是如何构建的。
  • 请检查您的示例以确认它是正确的(尤其是父 2、子 1 的子)并显示示例的所需返回值,我假设它是一个字符串数组。如果你分解字符串,你将如何识别" |- - Child 2_GrandChild2" 的父母和祖父母?

标签: ruby-on-rails ruby data-structures rubygems ruby-on-rails-5


【解决方案1】:

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

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(&amp;:last) 将这些二元素数组中的每一个映射到数组的最后一个元素。

【讨论】:

    猜你喜欢
    • 2016-05-02
    • 2016-06-23
    • 2020-10-04
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2021-12-03
    相关资源
    最近更新 更多