2017-03-11 4 views
3

I 배열이다른 배열 내의 배열에서 요소의 색인을 찾으려면 어떻게합니까? I는 제 2 어레이 내에서 발생하는 상기 어레이의 첫 번째 요소의 인덱스를 알아낼 어떻게</p> <pre><code>["a", "b", "c", "d"] </code></pre> <p>:

["next", "last", "d", "hello", "a"] 

첫번째 요소의 인덱스로부터 상기의 배열 내에서 최초의 배열은 2가됩니다. "D"는 첫 번째 배열에 속하고이 작업을 수행하는 몇 가지 방법이있다 위치 2.

+0

을 피할 수 하지만 그건 네가 한 말이 아니야. ''''(''d "'가 아닌)"첫 번째 배열의 첫 번째 요소가 위의 [두 번째] 배열에서 발생하지 않습니까? " –

답변

4

에서 발생하지만, 순진한 접근 방법은 가야 충분히 잘 작동 할 수 있습니다 :

tests = ["a", "b", "c", "d"] 
in_array = ["next", "last", "d", "hello", "a"] 

in_array.each_with_index.find do |e, i| 
    tests.include?(e) 
end 
# => ["d", 2] 

당신이 속도를 높일 수 있습니다 O (N)을 많이 피할 수 tests의 Set 조회를함으로써 최대 :

tests = Set.new([ ... ]) 

동일한 코드 include?에서 작동하지만 더 이상 목록에 훨씬 더 빨리 지금이다.

+0

감사합니다. 그렇다면 실제 색인을 얻는 방법은 무엇입니까? 나는 "found_index = in_array.each_with_index.find do | e, i | tests.include (e) [1] end"를 시도했지만 "NoMethodError : 정의되지 않은 메소드'[] for false : FalseClass"오류가 계속 발생합니다. –

+0

원한다면,이 연산의 결과를 간단히 설명 할 수 있습니다 :'found_test, found_index = in_array.each_with_index ...'여기서 두 개의 원소의 배열 대신 두 개의 변수를 얻습니다. 'include? '는'true' 또는'false'를 반환하므로 그렇게 참조 할 수 없습니다. 다른 방법은'found = in_array ...'이고,'found [0]'과'found [1]'일 것입니다. 이것은 아마도 여러분이 생각하고 있었지만 성급하게 일을하고있을 것입니다. – tadman

-1

비교할 배열을 반복하고 .select 또는 .find 반복기 메서드를 사용할 수 있습니다. .find는 배열에서 첫 번째 요소 일치를 선택하고 .select는 배열의 모든 요소와 일치합니다. 선택 항목에 색인을 추가하려면 .each_with_index를 추가 할 수 있습니다. '.index (a)'는 요소가 있으면 반환하고 그렇지 않으면 nil을 반환합니다.

alphabet = %w(a b c d) 
%w(next last d hello a).each_with_index.find {|a, _index| alphabet.index(a) } 
=> ["d", 2] 
%w(next last d hello a).each_with_index.select {|a, _index| alphabet.index(a) }[0] 
=> ["d", 2] 
# if you just need the index of the first match 
%w(next last d hello a).index {|a| alphabet.index(a) } 
=> 2 
+2

이 답변은 답안의 코드에 설명을 추가하여 향상시킬 수 있습니다. –

+0

안녕하세요, somethinng가있는 배열의 모든 요소를 ​​선택하고 있지만 첫 번째 요소 만 찾고 싶습니다. –

+0

첫 번째 요소가 필요한 경우 블록 끝에 [0]을 추가하거나 select 대신 find를 사용하여 조금 더 깨끗하게 반복 할 수 있습니다. –

0

이 방법은 두 개의 배열 사이에 공통 요소의 모든 인덱스가 포함 된 배열을 반환합니다. 당신이 첫 번째 일치하는 요소를 원하는 경우

def find_positions(original_array, look_up_array) 
    positions_array = [] 
    original_array.each do |x| 
    if look_up_array.index(x) != nil 
     positions_array << look_up_array.index(x) 
    end 
    end 
    positions_array 
    # positions_array.first => for the first matched element 
end 

당신은 positions_array.first을 반환 할 수 있지만,이 방법 당신은 여분의 조회를 피할 수 있습니다.

PS : 당신은 또한, #collect 사용하고 여분의 배열 (positions_array) 당신이 첫 번째 배열에서 발생하는 두 번째 배열의 첫 번째 요소의 인덱스를 원하는 것 같다 예에서