2010-05-04 2 views
0

나는 루비 온 레일 모델이 있습니다 C로 떨어없이필드에 단어가 n 개 이하임을 확인하는 가장 빠른 방법은 무엇입니까?

class Candidate < ActiveRecord::Base 
    validates_presence_of :application_essay 
    validate :validate_length_of_application_essay 

    protected 

    def validate_length_of_application_essay 
    return if application_essay.blank? # don't add a second error message if they didn't fill it out 
    errors.add(:application_essay, :too_long), unless ... 
    end 
end 

을의 application_essay 더 500 개 이상의 단어를 포함하지 있는지 확인하는 가장 빠른 방법은 무엇입니까? 대부분의 에세이는 최소 200 단어 이상, 5000 단어 이하일 것 같으며 영어 (또는 의사 영어는 때때로 "비즈니스"라고도 함)라고 가정 할 수 있습니다. 일반 사용자가 분류를 즉시 이해할 수있는 한 원하는 단어를 "단어"로 분류 할 수도 있습니다. (NB : 이것은 "일반 사용자"가 무엇인지 토론 할 장소가 아닙니다.)

답변

1

난 그냥 같은 것을 사용하는 것이 좋아 수있는 좋은 기사입니다? 문자열이 500 자 정도이므로 문제가되지 않아야합니다. 그것을위한 플러그인이있다

+0

이것은'- ''를 포함하여 공백으로 감싼 모든 것을 포함합니다. –

2

일종의 선형 검색보다 빠르지는 않을 것입니다. 미안합니다. (텍스트 편집기의 경우가 아니면 , 점진적으로 추적 할 수 있습니다)

+0

하지만 선형 검색은 무엇입니까? 스페이스? 단어 경계? 선형 검색을 할 때 추적해야하는 최소한의 정보량은 얼마입니까? 그리고 만약 내가 공백 그룹을 찾고 있다면, 분단 및 정복 전략이 나를 O (n)에서 O (log (n))로 데려 가지 않을까? –

+1

@James : 방금 하나의 공간을 찾고 문자열이 ASCII 문자로 정렬 된 경우 그렇습니다. 그럴 수도 있습니다. 그러나 총 단어 수를 계산하려면 전체 문자열의 모든 문자를 읽어야합니다 (한 가지 방법은 내 머리 꼭대기에서 문자열을 자르고 문자열을 계산하는 것입니다. 'str [i] = = ''&& str [i-1]! = '''그리고 1) –

1

단어의 일반적인 크기를 예측하고 나누어 단어의 양을 추측 할 수 있습니다. 여기

몇 가지 힌트 : http://blogamundo.net/lab/wordlengths/

당신은 5.1처럼 시도하고 몇 가지 검사를 실행하여 당신이 얼마나 정확하게 볼 수 있었다.

공백이 있기 때문에 6.1로 나누는 것이 좋습니다.

텍스트는 단지 거대한 양의 공백이 아닌 것으로 가정합니다. 그럼에도 불구하고 정말로 관심이 있다면 x 단어 이상을 가지고 있지 않은지 확인하십시오. 당신은 x 어쩌면 5에 낮은 숫자를 시도해 볼 수 있습니다. x 문자가 5 자 이하이면 x 단어가 더 많지 않을 것이라고 확신 할 수 있습니다.

그럼 다른 답변에서 설명한대로 선형 검색을하는 것이 더 나을 것입니다. 선형 검색은 그렇게 나쁘지 않습니다. 그것은 단지 당신이하고 싶은 일에 달려 있습니다.

string.split(" ").length <= 500 

어떤 성능 문제

당신이보고있는 :

+0

을 추가했습니다. "tyipcal word"로 무엇을 사용해야할지 모르지만 합리적인 가치를 발견 할 수 있다면 개념에 정말로 반대하지 않습니다. –

+0

내 게시물을 업데이트했습니다. – HansDampf

+0

그리고 다른 대답에 대한 귀하의 의견에 관한 : 나는 당신이 그것을 선형보다 빨리 얻을 수 있다고 생각하지 않는다. 거기에는 아무런 의미가 없지만 모든 단일 문자를 검사한다. 즉 최소 길이 n만큼의 연산을 의미한다. . – HansDampf

7

:tokenizer을 사용하는 lambda 방법에서도 작동합니다.

validates_length_of :essay, :minimum => 100, :too_short => "Your essay must be at least 100 words."), :tokenizer => lambda {|str| str.scan(/\w+/) } 

가장 빠를 수는 없지만 확실히 가장 깨끗한 방법 일 수 있습니다.

+1

그리고 더 정확합니다. 선택한 답안은 공백으로 구분 된 구두점을 포함합니다. 귀하의 솔루션은 적어도 구두점을 무시합니다. :-) –

+0

방법으로 이것을 넣을 수있는 방법이 있습니까? –

관련 문제