2014-04-08 2 views
0

배열의 배열은 arr3 = ["Ac,Ab,Aa", "Ba,Bb,Bd", "Ca,Cc,Cb", "Dd,Da,Dc", "aA,aC,aD", "bD,bA,bB", "cB,cA,cC", "dD,dC,dA"]item = ["dD"]입니다. "dD"또는 "Dd"가있는 항목을 제거하고 싶습니다.특정 값을 가진 배열 항목을 제거하는 방법

원하는 결과는 [ "Ac, Ab, Aa", "Ba, Bb, Bd", "Ca, Cc, Cb", "aA, aC, aD", "bD, bA, bB" cB, cA, cC "]. 이 같은

arr3 = ["Ac,Ab,Aa", "Ba,Bb,Bd", "Ca,Cc,Cb", "Dd,Da,Dc", 
     "aA,aC,aD", "bD,bA,bB", "cB,cA,cC", "dD,dC,dA"] 
item = ["dD"] 

def eliminate (from, item) 
    item1 = item.join 
    item2 = item1.reverse 
    from.select { |pair| !pair.include? item1 or !pair.include? item2} 
end 

eliminate(arr3, item) 
+0

코드가 작동하지 않는 방법을 설명해주십시오. –

+0

잘못된 결과물을 포함하도록 질문을 업데이트했습니다. –

+0

'item'은 항상 단지 하나의 요소입니까? –

답변

1

우아하지만 효과적인 ("brutto 엄마 오노") :

arr3 = ["Ac,Ab,Aa", "Ba,Bb,Bd", "Ca,Cc,Cb", "Dd,Da,Dc", "aA,aC,aD", "bD,bA,bB", "cB,cA,cC", "dD,dC,dA"] 
item = ["dD"] 
result = arr3.delete_if do |element| 
    triad = element.split(",") 
    triad.member?(item[0]) or triad.member?(item[0].reverse) 
end 
p result 
3

뭔가 :

나는은 다음하지만, 그것은 모든 항목을 필터링하지 않습니다 작동하지 않는, 그래서 arr3은 동일하게 유지하려고?

def eliminate from, item 
    from.reject { |e| e.include? item.join } & 
    from.reject { |e| e.include? item.join.reverse } 
end 

eliminate arr3, item 
# ["Ac,Ab,Aa", "Ba,Bb,Bd", "Ca,Cc,Cb", "aA,aC,aD", "bD,bA,bB", "cB,cA,cC"] 

또는 이것!

def eliminate from, item 
    from.reject do |e| 
    e.include?(item.join) || e.include?(item.join.reverse) 
    end 
end 

eliminate arr3, item 
# ["Ac,Ab,Aa", "Ba,Bb,Bd", "Ca,Cc,Cb", "aA,aC,aD", "bD,bA,bB", "cB,cA,cC"] 
+0

원래 포스터의 코드는'and' 대신'or'을 사용했기 때문에 작동하지 않았습니다. 하지만 대안 구현도 멋지다;) –

+0

@Cupcake, 이봐, 나는 너를 기억한다! 당신은 한때 자식 문제로 나를 도왔다. <3 – naomik

2

변경하려면 코드가 여기에 있기 때문에 당신의 상태로 작동하지 않는 and

from.select { |pair| !pair.include? item1 and !pair.include? item2} 
2

에 조건 :

!pair.include? item1 or !pair.include? item2 

and 대신 or을 사용하고 있기 때문에 "거꾸로"상태입니다. 대신 다음 중 하나를 원합니다.

!pair.include?(item1) && !pair.include?(item2) 
# or 
!(pair.include?(item1) || pair.include?(item2)) 

이것은 De Morgan's boolean conversion laws입니다. AB의 두 조건이 있다고 가정 해 보겠습니다. 그런 다음

not(A or B) = not(A) and not(b) 
not(A and B) = not(A) or not(B) 

당신은 pair이 포함되지 할 두 item1item2, 그 이유는 그래서 :

!pair.include?(item1) && !pair.include?(item2) 

그렇게 표현하는 자연스럽고 올바른 방법입니다.

0
arr3.reject { |str| str =~ /#{item.first}|#{item.first.reverse}/ } 
    #=> ["Ac,Ab,Aa", "Ba,Bb,Bd", "Ca,Cc,Cb", "aA,aC,aD", "bD,bA,bB", "cB,cA,cC"] 
관련 문제