繁体   English   中英

用谓词集合过滤集合并符合阈值

Filtering collection with collection of predicates and conforming to threshold

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我被困在为进行函数式编程而做的一项练习中,所以我的主要问题是如何对集合元素中传递的谓词进行计数,以及是否符合给定的阈值而不是将其收集到最终集合中。

我知道如何做到无极限,这是我的解决方案:

List<String> filter(List<Predicate<String>> predicateList, List<String> stringList) {
    return stringList.stream()
                     .filter(predicateList.stream()
                                          .reduce(x -> !(x.isEmpty()), Predicate::and))
                     .collect(Collectors.toList());
}

但是,当有参数确定要传递多少谓词以收集字符串时,我该怎么办,假设方法的主体看起来像这样:

List<String> filtrr(List<Predicate<String>> predicateList, List<String> stringList, Double threshold) {}

编辑:例如方法应通过单元测试,如下所示:

@Test
void filtrrTest() {
    Double threshold = 0.65;

    Predicate<String> predicate = p -> p.contains("lorem");
    Predicate<String> predicate1 = p -> p.length() > 10;
    Predicate<String> predicate2 = p -> p.contains("sed");

    List<Predicate<String>> predicateList = Arrays.asList(predicate, predicate1, predicate2);

    String string = "lorem ipsum dolor sit amet sed";
    String string1 = "consectetur adipiscing elit, sed do eiusmod";
    String string2 = "ipsum";
    String string3 = "adipiscing elit";
    String string4 = "sed do eiusmod";

    List<String> stringList = Arrays.asList(string, string1, string2, string3, string4);
    List<String> expectedList = Arrays.asList(string, string1, string4);

    assertEquals(expectedList, ClassName.filtrr(predicateList, stringList, threshold));
}
1 个回复

首先,我将创建一个通用实用程序方法,该方法检查给定元素是否匹配谓词的threshold %

public static <T> boolean matchingSome(
        T elem, 
        List<Predicate<T>> predicates, 
        double threshold) {

    long predsToMatch = (long) ((double) predicates.size() * threshold);

    long predsMatched = predicates.stream()
        .filter(p -> p.test(elem))
        .limit(predsToMatch) // this limit is to short-circuit as soon as
        .count();            // predsToMatch predicates evaluate to true

    return predsMatched == predsToMatch;
}

请注意,一旦predsToMatch谓词评估为true ,我就会使流短路。 这是为了避免继续评估其他谓词。

现在,只需收集上述方法返回true所有字符串:

List<String> result = stringList.stream()
    .filter(s -> matchingSome(s, predicateList, threshold))
    .collect(Collectors.toList());
1 使用阈值过滤对集合进行分组

我正在尝试提出一种算法来在map reduce中进行以下操作。 我收到了一堆对象和所有者的用户ID。 换句话说,我收到了一堆对: 我想以对(object,count)的列表结尾,其中count表示对象在列表中出现的次数。 需要注意的是,我们将需要过滤所有内容,如下所示: ...

2 使用谓词的通用集合过滤

我在 kotlin 中遇到了一个关于集合过滤的棘手问题...... 我有一个管理项目列表的基类,我希望能够使用关键字过滤列表,因此我使用 Filterable 方法扩展了该类。 我想要做的是能够使用这个“基类”扩展多个类,因此所有类的过滤器机制都是相同的。 这些类没有相同的属性...其中,过滤 ...

3 流星收集过滤收集

我有说四个对象的集合 什么是通过单个标志实现过滤器逻辑的好方法,当它为真时,我得到 当它是假的,我得到 我已经考虑了好一阵子了,仅靠一个标志就无法提出一个好的解决方案。 我的公寓是学生=是/否 这是我尝试过的 我期望当StudentFlag为true ...

4 多个谓词可将集合分类为哈希图

我有以下对象列表- 交易对象的外观 定义了用于标识每个状态事务的单个谓词。 预期的输出将是一个哈希图,其中将成功/失败/拒绝文本作为键,并将这些状态的总计数作为值 我无法在单个执行中继续执行此操作。 现在,我分别获得计数。 有人可以协助您吗? ...

5 Swift集合对象的协议与关联类型

我有一个问题(也许关于类型擦除)。 想象以下情况: 我有一个DataItem,它是UITableViewCell的抽象数据项,并且具有一个action属性,当选择单元格时应调用该action属性。 我的问题是如何创建一个DataItem对象数组,从该列表中选择一个项目(或对其进行迭代 ...

6 在集合中存储符合关联类型的泛型

我正在尝试存储使用关联类型的泛型,但是在尝试创建应符合我在类A顶部的泛型列表中描述的泛型类型的类型时,却出现了错误。 “无法使用类型为'(B)'的参数列表调用'追加'” 如何正确声明泛型,以便此代码起作用? 我也在使用Swift 4.2,因此如果有一种解决方案使用了较新的Sw ...

2018-07-31 00:17:13 1 20   swift
7 在集合MVVM中过滤集合

我有一个包含任务集合的项目dto列表。 在我的ViewModel上,我有一个用于项目的ICollectionView,因此我可以过滤标记为已完成的项目,请参见下面的过滤器代码。 这对于项目来说效果很好,但我也想过滤掉已完成的任务。 当ProjectDTO包含任务(列表)时,我无法将任 ...

8 根据另一个集合过滤一个集合

我有一个List&lt;businessobject&gt;对象集合和一个List&lt;string&gt;对象集合。 我想要过滤List&lt;businessobject&gt;以便如果业务对象中的某个属性等于List&lt;string&gt;任何内容,它将被过滤掉。 我可以想到以这 ...

9 Java垃圾收集 - 新阈值

我认为Young Generation中的对象必须经过15次小GC(最多15次)才能升级为老一代或Tenured Generation。 新阈值意味着什么?它如何影响JVM年轻一代GC或次要GC? 这是否意味着Young Generation不够大,以便JVM在对象上执行15 GC? ...

10 使用AND运算符CriteriaBuilder进行规范和谓词收集

为了从数据库中获取元素申请人列表,当我尝试检索它们时遇到了一个问题。 我知道在此示例中,我正在通过一个错误的方法来获取:获取实体的String ID,但这需要进行重构;) 这是我的规范,并且谓词使用join循环: 当我仅传递一个Mobility实体的ID时,它工作正常,但是当 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM