2010-05-04 32 views
0

我有一個的Ruby-on-Rails的模型:驗證字段不超過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 

沒有落入C,什麼是檢查application_essay包含不超過500個字的最快方法?你可以假設大多數散文至少200個單詞,不大可能超過5000個單詞,並且是英文的(或者僞英文有時被稱爲「business-ese」)。只要您的分類對於典型用戶來說是顯而易見的,您也可以將任何您想要的分類爲「單詞」。 (注意:這裏不是辯論什麼是「典型用戶」的地方:))

回答

1

我只想用像一個漂亮的文章:

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

什麼性能問題,你看見了什麼? 一個500字左右的字符串應該不是什麼大問題。

+0

這將計算任何用空格包裹的東西,包括'' - ''。 – 2010-12-29 23:07:16

2

你不會比線性搜索更快,對不起(除非這是用於某種文本編輯器,並且您可以逐步跟蹤)

+0

但是線性搜索什麼?空間?字的邊界呢?當我進行線性搜索時,我必須跟蹤的最小信息量是多少?如果我只是在尋找空白組,那麼是不是一種分而治之的策略會讓我從O(n)到O(log(n))? – 2010-05-04 01:47:48

+1

@James:如果你只是在尋找一個空格,並且字符串是按ASCII字符排序的,那麼是的,那可能是對的。但是,要計算字數的總數,您需要讀取整個字符串中的每個字符(單向,離開我的頭頂部,將修剪字符串,計算字符'str [i] = =''&& str [i-1]!=''',並添加1) – 2010-05-04 02:49:45

1

您可以估計單詞的典型大小,並通過除法猜測單詞的大小。

這裏一些提示:http://blogamundo.net/lab/wordlengths/

你可以嘗試像5.1,看看你是如何準確通過運行一些測試。

很可能除以6.1,因爲你有空格。

請記住,你會假設你的文字不只是大量的空白或什麼的。 那麼,但如果你真的只是有興趣,以確保它不超過x個字。你可以在x或者5上嘗試一個較小的數字,如果它少於x的5個字符,你可以確信它沒有多於x的單詞。

所以,你可能更好的做一個線性搜索,如其他答案中所述。線性搜索並不是那麼糟糕。這取決於你想要做什麼。

+0

我的確想到了這一點。我不知道用什麼作爲「tyipcal單詞」,但我並不真正反對這個概念,如果我能找到合理的價值。 – 2010-05-04 01:51:10

+0

我更新了我的帖子。 – HansDampf 2010-05-04 02:07:13

+0

而關於你在其他回答的評論: 我不認爲你可以得到它比線性速度更快,因爲找到的話沒有辦法,只能檢查每一個字符,這意味着你至少有n次操作,以至少n爲最小。 – HansDampf 2010-05-04 02:13:44

7

在Rails3中使用:tokenizerlambda方法也可以。

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

它可能不是最快的,但肯定是最乾淨的方式。

+1

它更準確。所選答案將計算任何以空格分隔的標點符號。你的解決方案至少忽略了標點符號。 :-) – 2010-12-29 23:05:54

+0

有沒有辦法把這個方法? – 2012-09-14 17:44:09

相關問題