-1

私はこれらの2つの配列を持っています

ArrayA = ["exampl@gmail.com", "example@techsolutions.net", "test@topgear.com"]
ArrayB = ["TopGear","Gmail", "Tech Solutions", "Google", "Facebook", "Exxon"]

今私がやりたいことはArrayA、 に存在する値のいずれかが含まれている場合ArrayB、その値を返す必要があるということです。include?単一のエントリについては、メソッドを使用できることを知っています。また、ある配列を別の配列にループすることも考えましたが、それは正しくないようで、ループの量が間違っています。

では、ここで 2 つの配列を比較し、ArrayBtrue が返された場合に値を返すにはどうすればよいでしょうか。

たとえば、ArrayAArrayBを比較する場合。配列の出力は何かのように見える可能性があります

ArrayC = ["Gmail", "Tech Solutions", "TopGear"]

のメールArrayAが の内容と一致したためですArrayB

それが理にかなっていることを願っています。

注: 配列内の要素の数は、上記の例に示されているものに限定されません。将来的には、配列内のそのような要素がさらに多くなる可能性があります。

ありがとう。どんな助けも

4

4 に答える 4

2

交点を見つける単純なケースは次のとおりです。

ArrayA | ArrayB

あなたの例に従って一致する交差点を見つけるための単純なアルゴリズムは次のとおりです。

ArrayA.select do |e|
  ArrayB.each_with_object( e.downcase )
    .reduce( false ) { |a, (e, o)| a or o.include? e.downcase }
end
# => ["exampl@gmail.com", "test@topgear.com"]; Tech Solutions hase space in it

接尾辞ツリーを使用すると、より優れたアルゴリズムが可能ですが、配列にそれぞれ 1000 を超える要素がある場合にのみ有利です。サフィックス ツリーに対応する Ruby gem を見つけるのは難しいため、これを示すのは少し難しいです。ただし、デモ目的では、いつでも実行できgit clone git://github.com/respan/ukkonen-ruby.git、次にcdディレクトリに移動して、irbそこで実行できます。その後:

require './ukkonen'
tree = SuffixTree.new ArrayA.join; nil
ArrayB.select { |e| tree.contains? e.downcase.delete ' ' }
#=>["TopGear", "Gmail", "Tech Solutions"]

私の望みは の一般化された接尾辞ツリーを構築することですがArrayA、そのような Ruby コードはまだ公開されていないため、 で不完全なハックを使用していることに注意してくださいArrayA.join

于 2013-06-18T08:05:49.447 に答える
1

メール チェックが重大な問題である場合、このコードを使用するとパフォーマンスが向上すると思いますが (ネスト ループは必要ありません)、これは一般的な解決策ではありません。

Hash h = {}
ArrayB.each{|x| h[x.delete(" ").downcase] = 0}
ArrayA.each{|s|
    m = p(/.*@([^\.]+)\..*/).match(s);
    h[m[1]] += 1 if(m && h[m[1]]) 
}
ArrayC = [];
h.each{|k,v|  ArrayC << k if v > 0}
于 2013-06-18T08:30:46.533 に答える