2014-09-09 2 views
0

정렬 된 배열이 있고 요소의 마지막 50-60-70 % (일반적으로 n %) 만 유지하려고합니다. 이것을 어떻게 할 수 있습니까? Ruby에서 배열의 마지막 n % 요소를 선택하는 방법은 무엇입니까?

[1,2,3,4,5,6,7,8,9].last(this.size*0.7) 

예를

를 들어

이 작동하지 않습니다.

+1

"작동하지 않음"이란 무엇을 의미합니까? 좀 더 일반적인 것으로 약간 수정하면,'a = [1,2,3,4,5,6,7,8,9]; a.last (a.size * 0.7)'는 배열 4 ~ 9를 원소로 반환합니다. 그게 네가 원하는게 아니야? – sameers

+0

클래스'Array'에 대한 새로운 메소드를 정의 할 수도 있습니다 : class Array; def last_percent (p); self.last (self.size * 0.01 * p); 종료; 끝 '. '[1,2,3,4,5,6,7,8,9]. last_percent (35) => [7, 8, 9]'. 내장 Ruby 클래스에 메서드를 추가하는 것을 "원숭이 패치"라고 부릅니다. 일부는 연습을 포용하고 다른 일부는 혐오합니다 .. –

답변

1

루비에 대해 잘 모르겠지만 Google과 추측 할 수 있습니다.

a = [1,2,3,4,5,6,7,8,9] 
a[a.size * 0.6..-1] ==> [6, 7, 8, 9] 
a.last(a.size * 0.4) ==> [7, 8, 9] 

그 이유는 먼저 당신이 그것을 참조하기 전에 배열에 이름을 지정해야한다는 것입니다. 이 경우 a입니다.

관련 문서에서 이와 같은 기능을 찾을 수 있습니다 : Array.

+0

Thx이지만 새로운 변수를 사용하지 않으려 고합니다. – Konstantin

+1

@Konstantin : 알았습니다. 이 질문에 다음 번에. ^^ – tilpner

0

당신이 도청하기 때문에 당신은 정말 당신이

[1,2,3,4,5,6,7,8,9].tap do |a| 
    #a is the original array passed into a block 
    a.delete_if.with_index{|index,element| element if index + 1 < a.size * 0.7} 
end 
#=> [4,5,6,7,8,9] 

같은 블록 안에 메소드 체인을 변경할 수 있습니다 당신은 당신이 #tap을 사용할 수 요청하는 기능이 원래의 배열을 파괴주의하십시오 어쨌든 변수에 원래의 배열을 저장하지 않기 때문에 걱정하지 않아도됩니다.

왜 배열을 변수에 저장하고 싶지 않은지 잘 모르겠지만 프로 시저를 훨씬 쉽게 만들 수 있습니다. 같은 간단한 방법 당신은 당신이 원하는 것처럼 객체를 참조하기 위해 tap를 사용하기 위해 필요한이

def last_n_percent(array,percent=0.5) 
    array.last(array.size * percent) 
end 
1

충분할 것입니다. 탭은 일반적으로 블록의 리턴 값을 무시되므로

[1,2,3,4,5,6,7,8,9].tap { |this| break this.last(this.size*0.7) } 

break 필요하다.

관련 문제