簡體   English   中英

如何在ruby / rails中合並兩個列表並刪除重復項?

[英]How do I merge two lists, and remove duplicates, in ruby/rails?

我有一個源對象在哪里

class Source

def ==(other)
  return false if self.url == nil || other == nil
  self.url == other.url
end

我有以下內容:

def self.merge_internal_and_external_sources(sources=[], external_sources=[])
    (sources + external_sources).uniq
end

我想合並這兩個列表,如果它們已存在於源列表中,則開始從external_sources中踢出項目。 我不確定如何雄辯地做到這一點?

我也嘗試過:

sources | external_sources

但由於我的==比較想在內部比較'url'屬性,這會產生一個沒有重復刪除的結果? 例如:

[src1] == [src2] # true
list = [src1] | [src2] 
list.size # 2

另一種選擇是使用#uniq方法。 但是,對於裸#uniq ,同樣的警告適用於#| 方法: #hash#eql? 按順序用於測試相同的元素。

但是, uniq 可以占用一塊 ,所以

(sources + external_sources).uniq &:url

即使懶惰定義#hash#eql?也可以應用#eql? 有關課程的方法。

我不確定“merge”是什么#merge (數組上沒有#merge方法,只有哈希),但你可以像這樣簡化你的代碼:

merged = sources | external_sources

要使它適用於您的類,您還需要兩個方法: #hash (實例哈希值,用於初步相等篩選)和#eql? ,用於確認平等:

class Source
  def hash
    url.hash + 1
  end
  # Or delegate it to the url:
  # require 'active_support/core_ext/module/delegation'
  # delegate :hash, to: :url

  def eql? other
    return false if url.nil? || other.url.nil?
    url == other.url
  end
end

#hash#eql? 是每個班級應該具備的基本設施。 添加這些后, #| #&方法將開始在Source實例的數組上運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM