104

Rubyクラスがあります

class MyClass
  attr_writer :item1, :item2
end

my_array = get_array_of_my_class() #my_array is an array of MyClass
unique_array_of_item1 = []

MyClass#item1にプッシュしたいのですが、まだ含まれていないunique_array_of_item1場合に限ります。私が知っている簡単な解決策があります。繰り返して、現在のファイルがすでに含まれているかどうかを確認するだけです。unique_array_of_item1item1my_arrayunique_array_of_item1item1

より効率的な解決策はありますか?

4

6 に答える 6

146

@Coorasseには良い答えがありますが、次のようになります。

my_array | [item]

そして、その場で更新するmy_arrayには:

my_array |= [item]
于 2013-11-05T19:28:15.413 に答える
84

Arrayの代わりにSetを使用できます。

于 2012-12-22T16:09:42.733 に答える
42

my_array手作業で繰り返す必要はありません。

my_array.push(item1) unless my_array.include?(item1)

編集:

Tombartが彼のコメントで指摘しているように、使用Array#include?はあまり効率的ではありません。小さなアレイではパフォーマンスへの影響はごくわずかだと思いますが、大きなアレイではそれを使用することをお勧めしSetます。

于 2012-12-23T02:17:20.797 に答える
34

item1を配列に変換し、それらを結合できます。

my_array | [item1]
于 2013-08-20T09:04:54.860 に答える
4

Setクラスと|を覚えておくことが重要です。メソッド(「SetUnion」とも呼ばれます)は、一意の要素の配列を生成します。これは、重複が必要ない場合は便利ですが、元の配列に一意でない要素が設計上含まれている場合は、不快な驚きになります。

元の配列に失われたくない重複要素が少なくとも1つある場合、早期に戻ることで配列を反復処理するのは最悪の場合のO(n)であり、これは大規模なスキームではそれほど悪くありません。 。

class Array
  def add_if_unique element
    return self if include? element
    push element
  end
end
于 2014-03-14T08:43:59.040 に答える
0

それが完璧な解決策かどうかはわかりませんが、私にとってはうまくいきました:

    host_group = Array.new if not host_group.kind_of?(Array)
    host_group.push(host)
于 2016-01-08T17:24:22.207 に答える