这是使用Java流api的最佳性能方法吗
我需要从这个字符串数组中创建一个新的字符串列表:这是使用Java流api的最佳性能方法吗,java,java-stream,Java,Java Stream,我需要从这个字符串数组中创建一个新的字符串列表: String[] groups = { "A_group1,AAAAA", "A_group2", "A_group3", "B_group4", "B_group5", "B_group
String[] groups = {
"A_group1,AAAAA",
"A_group2",
"A_group3",
"B_group4",
"B_group5",
"B_group6,BBBBBBB",
"C_group7",
"C_group8",
"C_group9,CCCCC",
};
我必须保留以以下前缀开头的字符串:
Map<String, String> mapping = new HashMap<>();
mapping.put( "prefix1", "A_" );
mapping.put( "prefix2", "B_" );
结果是:
[group4, group5, group6, group1, group2, group3]
这是正确的。但是我想知道是否有性能更好的代码逻辑效率低,与流的使用无关 您的外部循环应该在“groups”上,然后对照映射的值集进行检查,这是O(1)复杂度。比如:
Set<String> filter = new HashSet<>(mapping.values());
stream( groups ).filter(g -> filter.contains(g.split("_")[0] + "_")). ...
Set filter=newhashset(mapping.values());
流(组).filter(g->filter.contains(g.split(“\u”)[0]+“\u”)。。。
如果在过滤器上循环,则最终在组上循环n次,使复杂性为O(n^2),而不是线性
其余的在我看来很好:如果使用流API或普通的旧for循环,则不会有大的变化。请注意,如果您有大量的组,那么并行化流是有意义的;对于少数组来说,管理并行化的开销实际上会使执行速度变慢对于如此少量的元素,执行并行流甚至流都是不值得的。如果你追求的是速度,那么就使用good old for循环。这个问题可能更适合。你的输入是否有
,
?否则,group.split(“,”
如何工作。。。。想知道您是否要为此构建前缀树(trie)以优化查找!抱歉,是的,在极少数情况下,我必须拆分字符串我不知道CodeReview,下次我将询问那里的映射。values()
返回集合
,您如何将其分配给集合
?抱歉,您是对的,编辑我的回答不幸的是,我必须使用startsWith
,因为我只有string@DiegoMarcolungo如果您能够像示例中那样识别前缀(因为您可能会在下划线上拆分),则修改.filter()调用以检查您的组。如果您无法通过查看组名识别前缀,请再次使用Set.contains()检查组。拆分(“”)[0],如果您非常担心性能,那么您可能需要使用前缀树。
Set<String> filter = new HashSet<>(mapping.values());
stream( groups ).filter(g -> filter.contains(g.split("_")[0] + "_")). ...