2017-04-04 3 views
0

Ruby 2.4. 배열에서 지정된 인덱스에있는 요소를 제거하여 새 배열을 만들고 싶습니다. 나는 방법은 delete_at라고 생각하지만, 오히려 제거 된 요소에 적절한 수행하고 새로 생성 된 배열을 반환하지 않지만 :배열에서 지정된 인덱스의 요소를 제거하지만 내부에서 작업하지 않는 방법

2.4.0 :003 > a = ["a", "b", "c"] 
=> ["a", "b", "c"] 
2.4.0 :004 > a.delete_at(0) 
=> "a" 
2.4.0 :005 > a 
=> ["b", "c"] 

나는에 배열에서 요소를 삭제하려면 어떻게 지정된 인덱스를 사용하지만 그 자리에서 작업을 수행하지 않습니까?

답변

3

배열을 복제하고이 복제본에서 요소를 제거 할 수 있습니다. 배열을 반환하려면 tap을 사용하고 삭제 된 요소는 반환하지 않습니다.

2.3.3 :018 > a = ["a", "b", "c"] 
=> ["a", "b", "c"] 
2.3.3 :019 > b = a.dup.tap{|i| i.delete_at(0)} 
=> ["b", "c"] 
2.3.3 :020 > b 
=> ["b", "c"] 

또 다른 방법은 with_indexreject을 사용하는 것입니다

2.3.3 :042 > b = a.reject.with_index{|v, i| i == 0 } 
=> ["b", "c"] 
2.3.3 :043 > b 
=> ["b", "c"] 
1

당신은 주어진 배열의 지정된 인덱스에서 적은 요소와 동일한 인 새로운 배열을 생성하고 싶습니다.

Array#[] (별칭 : Array#slice) 및 Array#concat을 사용할 수 있습니다.

def copy_wo_element(arr, index_to_exclude) 
    arr[0,index_to_exclude].concat(arr[index_to_exclude+1..-1]) 
end 

arr = [1,2,3,4,5] 
copy_wo_element(arr, 0) 
    #=> [2, 3, 4, 5] 
copy_wo_element(arr, 1) 
    #=> [1, 3, 4, 5] 
copy_wo_element(arr, 2) 
    #=> [1, 2, 4, 5] 
copy_wo_element(arr, 3) 
    #=> [1, 2, 3, 5] 
copy_wo_element(arr, 4) 
    #=> [1, 2, 3, 4] 

대신

arr[0,index_to_exclude] + arr[index_to_exclude+1..-1] 

를 작성할 수 있지만, concat의 사용은 임시 배열 arr[index_to_exclude+1..-1]의 생성을 방지 할 수 있습니다.