programing

배열 Ruby에서 요소 제거

nasanasas 2020. 12. 5. 09:52
반응형

배열 Ruby에서 요소 제거


array에서 요소를 제거하려고한다고 가정 해 보겠습니다 a = [1,1,1,2,2,3]. 다음을 수행하는 경우 :

b = a - [1,3]

그런 다음 얻을 것입니다.

b = [2,2]

그러나 결과는

b = [1,1,2,2]

즉, 모든 경우가 아닌 뺀 벡터에서 각 요소의 인스턴스를 하나만 제거합니다. Ruby에서이를 수행하는 간단한 방법이 있습니까?


다음을 수행 할 수 있습니다.

a= [1,1,1,2,2,3]
delete_list = [1,3]
delete_list.each do |del|
    a.delete_at(a.index(del))
end

결과 : [1, 1, 2, 2]


[1,3].inject([1,1,1,2,2,3]) do |memo,element|
  memo.tap do |memo|
    i = memo.find_index(e)
    memo.delete_at(i) if i
  end
end

간단하지는 않지만 :

a = [1,1,1,2,2,3]
b = a.group_by {|n| n}.each {|k,v| v.pop [1,3].count(k)}.values.flatten
=> [1, 1, 2, 2]

또한 'subtrahend'에서 배수의 경우를 처리합니다.

a = [1,1,1,2,2,3]
b = a.group_by {|n| n}.each {|k,v| v.pop [1,1,3].count(k)}.values.flatten
=> [1, 2, 2]

편집 : 이것은 "기능적"솔루션을 만들기 위해 Norm212와 내 대답을 결합한 개선 사항입니다.

b = [1,1,3].each.with_object( a ) { |del| a.delete_at( a.index( del ) ) }

필요한 경우 람다에 넣으십시오.

subtract = lambda do |minuend, subtrahend|
  subtrahend.each.with_object( minuend ) { |del| minuend.delete_at( minuend.index( del ) ) }
end

그때:

subtract.call a, [1,1,3]

a = [1,1,1,2,2,3]
a.slice!(0) # remove first index
a.slice!(-1) # remove last index
# a = [1,1,2,2] as desired

자주 사용하는 간단한 솔루션 :

arr = ['remove me',3,4,2,45]

arr[1..-1]

=> [3,4,2,45]

속도를 위해 다음을 수행합니다. 두 배열을 각각 한 번만 통과하면됩니다. 이 방법은 순서를 유지합니다. 먼저 원래 배열을 변경하지 않는 코드를 제시 한 다음 쉽게 변경하여 변경하는 방법을 보여줍니다.

arr = [1,1,1,2,2,3,1]
removals = [1,3,1]

h = removals.group_by(&:itself).transform_values(&:size)
  #=> {1=>2, 3=>1} 
arr.each_with_object([]) { |n,a|
  h.key?(n) && h[n] > 0 ? (h[n] -= 1) : a << n }
  #=> [1, 2, 2, 1]

arr
  #=> [1, 1, 1, 2, 2, 3, 1] 

To mutate arr write:

h = removals.group_by(&:itself).transform_values(&:count)
arr.replace(arr.each_with_object([]) { |n,a|
  h.key?(n) && h[n] > 0 ? (h[n] -= 1) : a << n })
  #=> [1, 2, 2, 1]

arr
  #=> [1, 2, 2, 1]

This uses the 21st century method Hash#transform_values (new in MRI v2.4), but one could instead write:

h = Hash[removals.group_by(&:itself).map { |k,v| [k,v.size] }]

or

h = removals.each_with_object(Hash.new(0)) { | n,h| h[n] += 1 }

참고URL : https://stackoverflow.com/questions/8929053/removing-elements-from-array-ruby

반응형