Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在包含前缀的集合中查找条目_Java_Search_Set_Prefix - Fatal编程技术网

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

Java 在包含前缀的集合中查找条目,java,search,set,prefix,Java,Search,Set,Prefix,作为一名Java初学者,我正在做一些练习,但我就是做不到 这就是我正在处理的问题: public static Set<Person> prefixName(final Set<Person> persons, final String prefix) { ... } 公共静态集合前缀name(最终集合人员,最终字符串前缀){ ... } 集合由名称组成,而前缀是名称(或非名称)的子字符串。因此,使用persons={Larry,Dave,Laura},pre

作为一名Java初学者,我正在做一些练习,但我就是做不到

这就是我正在处理的问题:

public static Set<Person> prefixName(final Set<Person> persons, final String prefix) {
    ...
}
公共静态集合前缀name(最终集合人员,最终字符串前缀){
...
}
集合由名称组成,而前缀是名称(或非名称)的子字符串。因此,使用
persons={Larry,Dave,Laura},
prefix=La
,该方法将返回
{Larry,Laura}

我请我的一个朋友帮忙,他说去看看小溪。由于我正在使用的这本书还没有提到任何流,我相信还有一个更简单、更友好的解决方案


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

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

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;
}
公共静态集合前缀name(最终集合人员,最终字符串前缀){
final Set personsWithPrefix=new HashSet();
用于(最终人员:人){
if(person.getName().startsWith(前缀)){
personsWithPrefix.add(person);
}
}
返回带有前缀的人员;
}
或者,使用流的更紧凑的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());
}
公共静态集合前缀name(最终集合人员,最终字符串前缀){
returnpersons.stream()
.filter(person->person.getName().startsWith(前缀))
.collect(收集器.toSet());
}

您看过地图实现吗?我知道什么是HashMap,这也是我马上想到的。然而,这难道不要求字符串已经被映射,也就是说,一个
key=La
已经被映射到一个
value=Larry,Laura
?应该返回一个新的集合还是应该修改旧的集合?应该返回一个新的集合谢谢!这个天真的实现正是我想要的!请你也解释一下第二种解决方案好吗?我很好奇,既然你是第二个推荐streams的人,那么return语句到底是做什么的呢?还有:那么,将原始文档的所有元素添加到树集中不是更有意义吗?从长远来看,这不是更有效吗?流本质上也是这样,只是看起来更紧凑。它首先将集合视为
(因此它在内部使用其
迭代器
,并将其转换为
拆分器
)。然后告诉流在遍历元素时要做什么。它应该过滤掉条件解析为
false
的每个元素,并且只对其解析为
true
的元素继续迭代。然后它应该收集
集合中的所有内容。语句本身现在返回类型为
Set
,我们直接使用
return
返回它。如果以前将元素组织在
TreeSet
中,会更有效,是的。但是,如果您在需要时将所有内容复制到
树集合中,它将没有任何好处,因为添加还需要遍历每个元素,这是性能的瓶颈。很高兴它有所帮助。流的一大优点是它可以很容易地被并行化。您只需要调用
parallelStream()
,而不是
stream()
。这里的好处是,您的问题也可以在并行环境中完美地工作,因此您可以使用它,而无需进行任何进一步的更改。然后,流将在内部将集合的迭代器拆分为几个部分(这就是它使用拆分器的原因),并在CPU的另一个核心上遍历每个部分。这也是为什么如果使用并行流,迭代顺序是不可预测的。