查找包含前缀的Set中的条目

时间:2017-10-07 22:35:49

标签: java search set prefix

我作为Java初学者做了几个练习,但我无法让它工作。

这就是我正在使用的:

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

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

我问我的一个伙伴一些帮助,他说要看看溪流。由于我正在使用的这本书尚未提及任何关于流的文章,我相信它也有一个更简单,更初学者更友好的解决方案!

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

1 个答案:

答案 0 :(得分:2)

一般情况下,无法利用了解前缀以便查找元素。您将需要遍历整个集并检查每个条目。

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