3

いくつかの要素を複数回含む配列があります。次に、これらの要素の1つを削除して新しい配列を作成します。

例:

a = [1,1,1,2]
delete_index = a.find_index(1)
result = a.clone
result.delete_at(delete_index)
# result is now [1,1,2]

このコードは、このような簡単な作業には本当に醜いように見えます。Arrayが提供するメソッドを調べましたが、これを行うためのより良い方法を見つけることができませんでした。

4

3 に答える 3

2
a.delete_at(a.index(1) || a.length)

a.length要素が見つからない場合を処理します。範囲外であるため、何も削除されず、戻り値はになりますnil

clone質問の一部が配列のコピーに対してこれを行うことであった場合は、 :で呼び出すだけです。

a2 = a.clone ; a2.delete_at(...)

複製された要素ごとにこれを実行する場合は、複製された要素を選択するブロックにチェーンすることができます。

a.select { |e| array.count(e) > 1 }.each { |dup| a.delete_at a.index(dup) }
于 2012-06-18T15:56:29.360 に答える
1

あなたはアレイにモンキーパッチを当てることができます:

class Array
  def delete_first_occurrence(o)
    delete_at(find_index(o) || length)
    self
  end
end

a = [1,1,1,2]
result = a.clone.delete_first_occurrence(1)
 => [1, 1, 2]
于 2012-06-18T16:34:21.347 に答える
0

よくわかりませんが、配列から重複を削除しようとしているようです。その場合は、と同じくらい簡単array.uniqです。これにより、すべての重複が削除された新しい配列が返されます。元の配列をその場で変更したい場合は、array.uniq!代わりに使用できます。

それがあなたが達成しようとしていることではない場合は、あなたが達成しようとしていることのいくつかの入力と出力の例で質問を更新してください。

于 2012-06-18T15:55:20.810 に答える