2017-04-04 19 views
0

例の要素と一致する場合:私は類似性のための2つの配列を比較しarray1から関連する要素を戻したいルビー - 配列内の要素の一部が別の配列

array1 = ["budget2017.doc", "accounting2017.doc", "mydogisdumb.doc"] 
array2 = ["budget.doc", "accounting.doc", "imstupid.doc"] 

"budget.doc""budget2017.doc"と一致していないので、私は上記明らかに結果が["budget2017.doc", "accounting2017.doc"]

で新しい配列する必要がしかし

array1.select { |x| x.include?(array2) } 

は動作しません。各要素の最初の数文字と一致させ、関連する要素をarray1から戻すことができれば、私が必要とするものを達成することができます。

+0

実行するロジックは、array1の各要素X1に対して、array2のすべての要素を繰り返し処理します。配列2の各要素X2は、X1がX2と一致する場合は結果に追加します。 '=〜'演算子(x1 =〜x2 iirc)で正規表現検索を使うことができます。 – Vall3y

+0

ここに正確なパターンはありますか?最初の2つの場合は、数字だけを削除できます。しかし、後者の場合、あなたは少しミックスしています。一般的なケースでは、LevensteinやJaro-Winkler距離のような文字列類似アルゴリズムを使用できます。抽象的に一致する2つの文字列を検討するために必要なことを明確にすることができますか? – ndn

+0

ndn - 各配列には何百ものファイル名がありますが、array1のファイル名はarray2のファイル名と同じ始まりになりますが、拡張子の前にいくつかの余分な文字が入ります。各ファイル名の最初の数文字が同じであれば、私は試合に興味があります。 – Sean

答えて

1
array1 = %w[budget2017.doc accounting2017.doc mydogisdumb.doc] 
array2 = %w[budget.doc accounting.doc imstupid.doc] 

array1.select do |elem| 
    array2.any? do |ee| 
    s, e = ee.split('.') 
    elem.start_with?(s) && elem.end_with?(e) 
    end 
end 
#⇒ ["budget2017.doc", "accounting2017.doc"] 

あるいは、もう少し効率的コメント1として

selectors = array2.map { |e| e.split('.') } 
array1.select do |elem| 
    selectors.any? do |(s, e)| 
    elem.start_with?(s) && elem.end_with?(e) 
    end 
end 
#⇒ ["budget2017.doc", "accounting2017.doc"] 
0

array2のうち要素と同じ最初の7つの文字を有するarray1のすべての要素を見つける:

array1.select do |element| 
    array2.any? { |match_candidate| match_candidate.start_with? element[0...7] } 
end 
+0

ndn - 私は今夜それを試みます。ありがとうございました! – Sean

+0

これは私のために働いた。再度、感謝します。 – Sean

0
arr1 = ["budget2017.doc", "acc2017.doc", "acc.doc", "budget2016.doc", "foo.doc"] 
arr2 = ["budget.doc", "acc.doc", "foo.docx,", "goo.doc"] 

a2 = arr2.map { |s| s.split('.') } 
    #=> [["budget", "doc"], ["acc", "doc"], ["foo", "docx,"], ["goo", "doc"]] 
arr1.select { |s1| a2.any? { |pfx, sfx| s1 =~ /\A#{pfx}.*\.#{sfx}\z/ } } 
    #=> ["budget2017.doc", "acc2017.doc", "acc.doc", "budget2016.doc"] 
+0

'start_with?'と 'end_with? 'は正規表現マッチよりも高速です。 – mudasobwa

関連する問題