首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用布尔逻辑创建自定义筛选器的Web窗体

使用布尔逻辑创建自定义筛选器的Web窗体
EN

Stack Overflow用户
提问于 2014-04-01 02:03:39
回答 1查看 150关注 0票数 0

我有一个Rails应用程序,在这个应用程序中,我希望用户能够从一个类别列表中创建自定义布尔组合,这个列表本身就是动态加载的。例如,如果我有类别foo barbaz,我希望用户能够选择(foo AND bar) OR bazfoo OR baz或这些类别的任何其他逻辑组合。我预计最常见的用例是类似于(a OR b OR c) AND (d OR e OR f) AND (g OR h)的东西,也就是几个分离的连接。

然后将结果存储在某种数据结构中,这些数据结构以后可以用作筛选器。理想情况下,这一切都是通过图形界面完成的,而不是让用户在文本中构造布尔逻辑。

在我尝试自己实现这个之前,是否有一个已经实现了这个或类似的库?或者是一些开源的东西,可以让我成为其中的一部分,并且可以分叉和修改?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-01 08:40:32

您可以通过选择给定类别的四种方法实现布尔检索

  1. 未选定
  2. 阳性选择(+前缀;类别是强制性的)
  3. 否定选择(谷歌搜索中的-前缀;不能出现类别)
  4. 选定(无前缀)

不是在ruby-on-rails中,但可能很容易从c#中翻译出来

代码语言:javascript
复制
    public bool IsMatch(string s)
    {
        s = s.ToLower();

        bool ret = ((negWords.Count == 0) || !hasMatchInSet(s, negWords, true))
           && ((posWords.Count == 0) || hasMatchInSet(s, posWords, false))
           && ((words.Count == 0) || hasMatchInSet(s, words, true));

        return ret;
    }

   private bool hasMatchInSet(string s, HashSet<string> setOfWords, bool breakOnFirstMatch)
    {
        int matches = 0;
        bool ret = false;

        foreach (string w in setOfWords)
        {
            if (s.IndexOf(w, StringComparison.InvariantCultureIgnoreCase) >= 0)
            {
                matches++;

                if (breakOnFirstMatch)
                {
                    break;
                }
            }
        }

        ret = (breakOnFirstMatch && (matches > 0)) || (matches == setOfWords.Count);

        return ret;
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22775496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档