8

Array#dropは、配列の最初のn要素を削除します。配列の最後のm 個の要素を削除する良い方法は何ですか? あるいは、配列の中間要素 ( nより大きい、mより小さい) を保持する良い方法は何ですか?

4

8 に答える 8

28

これはまさにArray#pop次の目的です。

x = [1,2,3]
x.pop(2) # => [2,3]
x # => [1]
于 2012-11-23T17:16:31.110 に答える
9

Array#slice メソッドを使用することもできます。

[1,2,3,4,5,6].slice(1..4) # => [2, 3, 4, 5]

また

a = [1,2,3,4,5,6]
a.take 3 # => [1, 2, 3]
a.first 3 # => [1, 2, 3]
a.first a.size - 1 # to get rid of the last one
于 2012-11-23T17:08:57.360 に答える
2

drop(最初の n 個の要素を削除する)の最も正反対は、最初の n 個takeの要素を保持する です ( にtake_while類似したものもありますdrop_while)。

Slice を使用すると、範囲またはオフセットと長さを指定して、配列のサブセットを返すことができます。Array#[] は、引数として範囲を渡された場合、または 2 つの数値が渡された場合と同じように動作します

于 2012-11-23T17:11:11.430 に答える
1

戻り値を、削除された要素のない配列にしたかったのです。私はここでいくつかの解決策を見つけました:

count = 2
[1, 2, 3, 4, 5].slice 0..-(count + 1) # => [1, 2, 3]
[1, 2, 3, 4, 5].tap { |a| a.pop count } # => [1, 2, 3]

しかし、配列の順序が重要でない場合 (私の場合、ファイルを削除していた場合) は、より読みやすい別の解決策を見つけました。

count = 2
[1, 2, 3, 4, 5].reverse.drop count # => [3, 2, 1]

順序を維持する必要がある場合は、そこに別のものを追加できますが、その時点で.reverseの解決策を好むと思います.tap

于 2018-10-11T05:52:27.160 に答える
1

これにより、最後の n 要素が削除されます。

a = [1,2,3,4,5,6]
n = 4
p a[0, (a.size-n)]

#=> [1, 2]

n = 2
p a[0, (a.size-n)]
#=> [1, 2, 3, 4]    

「中間」要素について:

min, max = 2, 5
p a.select {|v| (min..max).include? v }
#=> [2, 3, 4, 5]
于 2012-11-23T17:06:05.410 に答える
0

Array#delete_at() は、配列の最後の要素を削除する最も簡単な方法です。

arr = [1,2,3,4,5,6]
arr.delete_at(-1) # => [1,2,3,4,5]

配列のセグメントを削除するには、他の回答のメソッドを使用します。

于 2021-03-14T08:06:01.317 に答える
-2

いくつかのメソッドを追加することもできます

class Array

  # Using slice
  def cut(n)
    slice(0..-n-1)
  end

  # Using pop
  def cut2(n)
    dup.tap{|x| x.pop(n)}
  end

  # Using take
  def cut3(n)
    length - n >=0 ? take(length - n) : []
  end

end

[1,2,3,4,5].cut(2)
 => [1, 2, 3] 
于 2012-11-23T17:12:27.757 に答える