当前位置: 首页 > 知识库问答 >
问题:

最佳匹配的流过滤

谢翰学
2023-03-14

我的目标是筛选出最佳匹配。在我的例子中,我有一个人员列表,我想按姓氏和名字过滤。

匹配的预趋势将是:

    < li >姓和名都匹配,返回第一个匹配项 < li >仅姓氏匹配,返回第一个匹配项 < li >不匹配,抛出一些异常

我目前为止的代码:

final List<Person> persons = Arrays.asList(
  new Person("Doe", "John"),
  new Person("Doe", "Jane"),
  new Person("Munster", "Herman");

Person person = persons.stream().filter(p -> p.getSurname().equals("Doe")).???

共有3个答案

宇文卓
2023-03-14

我会提出这个建议:

Optional<Person> bestMatch = persons.stream()
            .filter(p -> "Doe".equals(p.getSurname()))
            .reduce((person, person2) -> {
                if ("John".equals(person.getFirstName())) {
                    return person;
                } else if ("John".equals(person2.getFirstName())) {
                    return person2;
                }
                return person;
            });
Person result = bestMatch.orElseThrow(IllegalArgumentException::new);
慕弘义
2023-03-14

你可以用

Person person = persons.stream()
        .filter(p -> p.getSurName().equals("Doe"))
        .max(Comparator.comparing(p -> p.getFirstName().equals("Jane")))
        .orElse(null);

它将只考虑具有正确姓氏的元素,并返回其中最好的元素,即具有匹配名字的元素。否则,返回第一个匹配的元素。

正如在注释中已经提到的,如果存在最佳元素,for循环可能会更有效,因为它可能会短路。如果没有匹配姓氏和名字的最佳元素,则必须在所有实现中检查所有元素。

傅振濂
2023-03-14

假设Person实现了equals和hashCode:

Person personToFind = new Person("Doe", "Jane");

Person person = persons.stream()
    .filter(p -> p.equals(personToFind))
    .findFirst()
    .orElseGet(() -> 
        persons.stream()
            .filter(p -> p.getSurname().equals(personToFind.getSurname()))
            .findFirst()
            .orElseThrow(() -> new RuntimeException("Could not find person ..."))
    );
 类似资料:
  • 问题内容: 我有一个包含单词的表和一个输入字段,可使用实时搜索来搜索该表。当前,我使用以下查询来搜索表: 有没有一种方法可以对结果进行排序,以使在单词开头找到字符串的字符串排在最前面,而在单词后面出现字符串的字符串排在最后呢? 例如:搜索“ hab ”当前返回 一个 lphabet ^ h 升技 [R EHAB 但我想这样: 赞 一下(首先是因为“赞”是开始) alp hab et(第二个原因是’

  • 问题内容: 我试图模糊匹配两个csv文件,每个文件包含一列名称,它们相似但不相同。 到目前为止,我的代码如下: 输出如下: 该脚本工作正常。输出是预期的。但是我所寻找的只是最佳的匹配。 因此,我需要基于第2列中的最大值,以某种方式删除第1列中的重复名称。这应该相当简单,但是我似乎无法弄清楚。任何帮助,将不胜感激。 问题答案: Fuzzywuzzy会以反向排序的顺序返回列表,最佳匹配排在最前面。 因

  • 在我的Django项目中,我在项目的根目录中有一个静态文件夹(靠近manage.py),所以在settings.py中,为了找到这个静态文件,我有: STATICFILES_DIRS=[os.path.join(BASE_DIR,'static'),] 如何配置?现在我想: STATIC_ROOT=os.path.join(BASE_DIR,“static/”) 但当我运行collectstati

  • 我在Firestore中收集了一组文档,其中有一个字段是字符串数组,这些是添加到数据中的标记。 用户可以通过在前端选择和取消选择这些标签来过滤数据,所以我正在做一个数组来查询Firestore。 然后,我在最佳匹配上对结果进行评分,因此匹配更多标签的文档被排序到顶部,并显示到页面顶部供用户使用。 我现在正试图用带有文档快照的startAfter作为光标和限制,对这些数据进行分页。但我需要确保,当限

  • 问题内容: 我现在正在使用C#,并且正在使用JSON.Net将JSON字符串解析为C#对象。我的问题的一部分是我得到了一些像这样的字符串: 当我尝试使用进行反序列化时,它将引发异常。 我想知道将这个较大的字符串拆分为较小的json字符串的最佳方法是什么。 我正在考虑遍历字符串并匹配“级别0”的花括号。这似乎是个好主意吗?还是有更好的方法来做到这一点? 问题答案: 您可以将标志设置为true来使用a