2

ある多次元配列の要素が別の同様に構造化された配列に存在するかどうかを判断しようとしています。

suspects = [['Rod', 100], ['Jane', 75], ['Freddy', 125]]
criminals = [['Bill', 75], ['Ted', 50], ['Rod', 75]]

私が探している応答は、true または false です。上記の例では、Rod が両方の配列に存在するため、応答は true になります。2 番目の層の配列にある整数値には関係がありません。

このようなテストを通常の Ruby のような簡潔さでコーディングするにはどうすればよいでしょうか?

4

5 に答える 5

5
suspects.any? do |suspect, _|
  criminals.any? do |criminal, _|
    suspect == criminal
  end
end
于 2009-08-10T22:11:44.273 に答える
3

次のように高速化します。

suspects.any? {|s,_| criminals.assoc(s)}
于 2009-08-11T01:46:38.303 に答える
2

sepp2k は私を打ち負かしましたが、実装にどれだけ近づいたかを示すために送信する必要があります。


suspects.find do |suspect_name, _|
  criminals.find {|criminal_name, _| criminal_name == suspect_name}
 end 

私は彼の any? の使用が好きですが、内側のブロックはインラインであるべきだと思います:)

于 2009-08-10T22:14:40.103 に答える
0

私は必ずしもこれを推奨しているわけではありませんが、別の 1 行のオプション (を数えると 2 つrequire) は次のようになります。

require 'set'
(suspects.map{|s| s[0]}.to_set & criminals.map{|c| c[0]}.to_set).size > 0

=> true

各項目の最初の要素から配列を構築し、それをSet. (intersect) メソッドがあり、答えの結果のサイズを確認しますSet&

于 2009-08-11T08:19:12.423 に答える
0

どうですか:

(suspect.size + criminal.size) > (suspect | criminals).size

サンプル:

suspects = [['Rod', 100], ['Jane', 75], ['Freddy', 125]]
criminals = [['Bill', 75], ['Ted', 50], ['Rod', 75]]

guilty = (suspects.size + criminals.size) > (suspects | criminals).size
# Returns false. Since no common element was found in the merging.

criminals << ['Jane', 75]
guilty = (suspects.size + criminals.size) > (suspects | criminals).size
# Returns true. Since one element is common, merged array will be shorter by one.
于 2009-08-11T06:33:34.303 に答える