干净的“前缀”在一组数组中?

发布于 2024-10-31 12:35:22 字数 440 浏览 4 评论 0原文

我想知道,我有一组包含我自己的数据类型的数组。 看起来像这样:

traces = {[<label1>, <label2>], [<label1>], [<label1>,<label2>,<label3>]}

现在,我想要一个方法来清理集合中所有“前缀”现有的数组, 所以我的新集将在这个例子中:

traces = {[<label1>,<label2>,<label3>]} 

有人知道如何从中进行干净的实现吗? 我希望有一个比单步执行跟踪和 Set new_traces 并多次比较每个数组项更简洁的解决方案。

笔记: 我定义数组 A 是数组 B 的前缀当且仅当数组 B 的第一项实际上是数组 A

I was wondering, I've got a Set of Arrays containing something of my own datatype.
something looking like:

traces = {[<label1>, <label2>], [<label1>], [<label1>,<label2>,<label3>]}

Now, I would like to have a method that cleans all 'prefix'-existing arrays in the Set,
so my new set will be in this example:

traces = {[<label1>,<label2>,<label3>]} 

Anybody an idea how to make a clean implementation out of this?
I hope there is a neater solution than stepping through traces and a Set new_traces and comparing every array-item several times.

Note:
I define Array A is a prefix of Array B iff the first items of Array B are actually the Array A

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

黯淡〆 2024-11-07 12:35:22

不是最快的解决方案,但相当简单:

s = Set.new([[1,2],[1],[1,2,3]])
s.reject{|prefix|
  s.any?{|array|
    array.length > prefix.length && array[0,prefix.length] == prefix
  }
}
#=>[[1, 2, 3]]

Not quite the fastest solution, but rather simple:

s = Set.new([[1,2],[1],[1,2,3]])
s.reject{|prefix|
  s.any?{|array|
    array.length > prefix.length && array[0,prefix.length] == prefix
  }
}
#=>[[1, 2, 3]]
怼怹恏 2024-11-07 12:35:22

调用 flatten 然后调用 uniq

 class T
  attr_accessor :n
  def initialize(n); @n = n; end
  def eql?(other); n.eql?(other.n); end
  def hash; n.hash; end
end

a = [T.new(1), T.new(2), T.new(3), T.new(4), T.new(2), T.new(1), [T.new(2), T.new(2)], [T.new(4)]]

a.flatten.uniq.map(&:n) # => [1, 2, 3, 4]

call flatten and then uniq

 class T
  attr_accessor :n
  def initialize(n); @n = n; end
  def eql?(other); n.eql?(other.n); end
  def hash; n.hash; end
end

a = [T.new(1), T.new(2), T.new(3), T.new(4), T.new(2), T.new(1), [T.new(2), T.new(2)], [T.new(4)]]

a.flatten.uniq.map(&:n) # => [1, 2, 3, 4]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文