2010-05-04 72 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

相关问题