2015-01-30 2 views
0

저는 현재 루비를 배우고 있습니다. 훈련을 위해 배열에 특정 값을 검사하고 인덱스를 반환하는 자체 메서드로 Array 클래스를 확장하려고했습니다. 값에 배열에 둘 이상의 인덱스가있는 경우 모든 인덱스를 반환합니다.배열에서 값의 인덱스 찾기

일부 루프 및 일부 관계 연산자에서이 문제를 해결하기 위해 노력했지만 배열 클래스로 작업하는 데 적합하지 않습니다. 만약 누군가 내가 나에게 방향을 바꿀 수있는이 퀘스트를위한 해결책을 줄 수 있다면 그것은 좋을 것이다.

+0

시도한 것을 보여주는 코드를 게시해야합니다. –

+0

이것을 돕는 대부분의 메소드는 Enumerable 모듈에 있습니다 (그리고 배열은 열거 가능합니다). –

+0

이 질문은 매우 잘 닫힙니다. 내가하지 희망. [묻는 방법] (http://stackoverflow.com/help/how-to-ask)의 지침을 검토하고 '이 문제를 해결하기 위해 노력한'곳에서 참조 할 수있는 코드를 제공하여 귀하의 질문과 관련된 피드백을 얻고 귀하의 상황에있는 다른 사람들에게 도움이됩니다. – vgoff

답변

1

여기에 한 가지 방법 많은 중입니다 :

class Array 
    def find_indices(val) 
    each_with_index.select { |e,i| e == val }.map(&:last) 
    end 
end 

[1,3,5,2,6,3,5,7,8,3,2,4].find_indices(3) 
    #=> [1, 5, 9] 

여기에서 일어나고있는 일입니다. 먼저 val3과 동일하게 설정됩니다. 다음으로 명시적인 수신자가 제공되지 않으므로 Enumerable#each_with_index 메서드는 self으로 전송됩니다.

puts "self = #{self}" 

을하는 방법 find_indices의 시작 : self은 쉽게 줄을 추가하여 확인할 수 있습니다 배열을, 같습니다. 이제 당신이 얻을 것이다 :

[1,3,5,2,6,3,5,7,8,3,2,4].find_indices(3) 
# self = [1, 3, 5, 2, 6, 3, 5, 7, 8, 3, 2, 4] 
#=> [1, 5, 9] 

당신이 문서에서 볼 때, each_with_index이 블록을 제공하지 않기 때문에, 열거가 반환됩니다

enum = [1,3,5,2,6,3,5,7,8,3,2,4].each_with_index 
    #=> #<Enumerator: [1, 3, 5, 2, 6, 3, 5, 7, 8, 3, 2, 4]:each_with_index> 

enum의 요소를 검사 수로 변환하기 어레이 :

enum.to_a 
    #=> [[1, 0], [3, 1], [5, 2], [2, 3], [6, 4], [3, 5], 
    # [5, 6], [7, 7], [8, 8], [3, 9], [2, 10], [4, 11]] 

다음으로 상기 방법을 Enumerable#selectenum에 보내기

01,
new_enum = enum.select 
    #=> #<Enumerator: #<Enumerator: [1, 3, 5, 2, 6, 3, 5, 7, 
    # 8, 3, 2, 4]:each_with_index>:select> 

new_enum.to_a 
    #=> [[1, 0], [3, 1], [5, 2], [2, 3], [6, 4], [3, 5], 
    # [5, 6], [7, 7], [8, 8], [3, 9], [2, 10], [4, 11]] 

new_enum의 설명을주의 깊게 살펴보십시오. "복합 열거 자"라고 생각하는 것이 도움이되지만 열거 자라는 점을 알 수 있습니다.

이제 우리는 select 블록을 제공하므로 new_enum의 각 요소가 블록으로 전달됩니다. 전달 된 첫 번째 요소는 [1, 0]이며, 블록 변수의 할당한다 : 우리는 (e == val) #=> (1 == 3) #=> false는, 요소가 선택되지 않도록 찾을

e, i = [1, 0] 
e #=> 1 
i #=> 0 

. 블록에 전달 된 다음 요소 인 [3, 1](3 == 3) #=> true이되므로 [3, 1]이 선택됩니다.

우리는 얻을 :

a = new_enum.each { |e,i| e == val } 
    #=> [[3, 1], [3, 5], [3, 9]] 

우리가 원하는 이러한 값의 인덱스를이다, 우리는 매핑하여 그들을 추출하는 :

a.map { |e| e.last } 
:

a.map(&:last) 
    #=> [1, 5, 9] 

에 해당되는

이렇게 마지막 작업을 수행 할 수도 있습니다.

a.transpose.last 

이렇게하는 또 다른 간단한 방법은 다음과 같습니다.

class Array 
    def find_indices(val) 
    index = 0 
    each_with_object([]) do |e,a| 
     (a << index) if e == val 
     index += 1 
    end 
    end 
end 

[1,3,5,2,6,3,5,7,8,3,2,4].find_indices(3) 
    #=> [1, 5, 9] 
관련 문제