java - 在 Set 中查找包含前缀的条目

标签 java search set prefix

作为一名 Java 初学者,我正在做一些练习,但我就是无法让它发挥作用。

这就是我正在处理的内容:

public static Set<Person> prefixName(final Set<Person> persons, final String prefix) {
    ...
}

集合由名称组成,而前缀是名称的子字符串(或不是)。因此,对于 persons = {Larry, Dave, Laura}, prefix = La,该方法将返回 {Larry, Laura}

我向我的一个 friend 寻求帮助,他说要调查一下流。由于我正在使用的书还没有提到流,所以我相信还有一个更简单、更适合初学者的解决方案!

This基本上是同样的问题,但是使用 TreeSet,它显然有一个非常方便的方法来解决这个问题。

最佳答案

通用集合不能利用知道前缀来查找元素。您需要遍历整个集合并检查每个条目。

TreeSet 但是可以利用这些知识,因为其中的条目按前缀排序。为了找到所有前缀,您只需要获取以前缀为根的整个子树,这可以快速计算。

这是显示 TreeSet 内部结构的插图:

TreeSet structure

<小时/>

这是明显幼稚的实现:

public static Set<Person> prefixName(final Set<Person> persons, final String prefix) {
    final Set<Person> personsWithPrefix = new HashSet<>();
    for (final Person person : persons) {
        if (person.getName().startsWith(prefix)) {
            personsWithPrefix.add(person);
        }
    }
    return personsWithPrefix;
}

或者使用流的更紧凑的Java 8解决方案:

public static Set<Person> prefixName(final Set<Person> persons, final String prefix) {
    return persons.stream()
        .filter(person -> person.getName().startsWith(prefix))
        .collect(Collectors.toSet());
}

关于java - 在 Set 中查找包含前缀的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46625774/

相关文章:

go - 在 golang 中,哪个更快地找到两个数组的交集?

java - 通过 addMouseListener 添加时如何检测鼠标点击 menuItem

java - Apache POI 生成 excel 图表

php - FOSElastica bundle : retrieving highlights for results

c# - NHibernate MySQL 映射设置列类型

php - 类、封装和用户输入

java - Java中并发Cache的修改

java - Spring 和 JSR 303 验证。如何仅验证某些属性?

javascript - 使用 Javascript 在 JSON 中查找值

batch-file - 批处理脚本 - 在目录中的多个文件中查找和替换文本