чистые "префиксы" в наборе массивов? - PullRequest
0 голосов
/ 12 апреля 2011

Мне было интересно, у меня есть Набор Массивов, содержащий что-то из моего собственного типа данных. что-то похожее:

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

Теперь я хотел бы иметь метод, который очищает все существующие в наборе префиксные массивы, поэтому мой новый набор будет в этом примере:

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

Кто-нибудь знает, как сделать из этого чистую реализацию? Я надеюсь, что есть более подходящее решение, чем пошаговое выполнение трассировки и Set new_traces и сравнение каждого элемента массива несколько раз.

Примечание: Я определяю Array A как префикс Array B, если первые элементы Array B на самом деле являются Array A

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

Не совсем быстрое решение, но довольно простое:

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]]
0 голосов
/ 12 апреля 2011

вызов сгладить и затем 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...