在包含前缀的集合中查找条目

Finding entries in a Set containing a prefix

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

这就是我正在使用的:

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

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

我向我的一个好友寻求帮助,他说要查看流。由于我正在使用的书还没有提到任何流,我相信也有一个更简单、对初学者更友好的解决方案!

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

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

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

这是一个 TreeSet:

的内部结构图


这是明显的天真实现:

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());
}