如何在java中检查流中的参数? [关闭]

Posted

技术标签:

【中文标题】如何在java中检查流中的参数? [关闭]【英文标题】:How to check params in a stream in java? [closed] 【发布时间】:2022-01-19 23:13:17 【问题描述】:

我有一个这样的 .csv 文件:

17/08/2019;15:00;Norwich;Newcastle;3;1;H;S Attwell;1;3;0;0

我必须实现一个“进程”类来处理数据。 获取带参数的字符串数组进行搜索:

List<String> params = new ArrayList<>();
params.add("Newcastle");
params.add("H");

我必须使用流来查找字符串中的参数。 我试过了,但不行:

return params.stream()
 .filter(item -> data.contains(item))
 .count();

data 是读入并解析的 .csv 文件。

【问题讨论】:

什么不起作用?请附上minimal reproducible example。 顺便说一句,您有大量的 Java 库可供选择,可以为您处理 CSV 文件。 如果您可以使用库 univocity-parsers 是处理 CSV 文件的绝佳选择。 您只有一行 CSV 文件,字段可以是多种类型。您需要按要求提供minimal reproducible example,并包含有关您想要做什么的其他详细信息,显示特定输入的输出。 什么是具有contains() 方法的data:代表整个文件的字符串、字符串集合(每个字符串代表一个单元格)、一个花哨的类?计算匹配参数的目的是什么?您不应该需要包含参数的过滤行集合吗?应该找到所有个参数还是任何个参数? 【参考方案1】:

tl;r

List
.of( "Newcastle" , "H" )  
.stream()
.anyMatch( 
    List
    .of( 
        "17/08/2019;15:00;Norwich;Newcastle;3;1;H;S Attwell;1;3;0;0"
        .split( ";" )  // Returns an array of `String` objects.
    )                  // Returns a `List` object.
    :: contains        // Defines a method reference, to be passed as a `Predicate` object in our call to `Stream#anyMatch`.
)

看到这个code run live at IdeOne.com。

是的

详情

使用分号作为分隔符,将您的输入字符串解析成片段。

List < String > inputs = List.of( "17/08/2019;15:00;Norwich;Newcastle;3;1;H;S Attwell;1;3;0;0".split( ";" ) ) ;

上面那一行首先通过调用String#split 将输入字符串解析为String 对象的数组。然后将该数组传递给List.of 以实例化List 集合对象。

定义你的目标。

List < String > targets = List.of( "Newcastle" , "H" ) ;

进行比较。使用Stream#anyMatch 在一次点击后停止比较。

boolean inputsContainAtLeastOneTarget = 
    targets.stream().anyMatch( target -> inputs.contains( target ) ) ;

我们可以通过使用方法引用来缩短 .anyMatch 调用。

boolean inputsContainAtLeastOneTarget = 
     targets.stream().anyMatch( inputs :: contains ) ;

看到这个code run live at IdeOne.com。

是的

【讨论】:

【参考方案2】:

按照说明添加minimal, reproducible example 会很好,但假设您要收集数据中存在的参数。

那么,你可以试试下面的代码sn-p;

List<String> params = new ArrayList<>();
params.add("Newcastle");
params.add("H");
params.add("E");

        
List<String> data = Arrays.asList("17/08/2019","15:0","Norwich","Newcastle","3","1","H","S Attwell","1","3","0","0");

List<String> existingParamList = params.stream()
    .filter(data::contains)
    .collect(Collectors.toList());

如果不是这样,请添加示例。

【讨论】:

以上是关于如何在java中检查流中的参数? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查结构化流中的 StreamingQuery 性能指标?

你如何在 java 中访问 MIDI IN 流中的数据?

如何在音频文件/流中搜索内容? [关闭]

如何在 Java/Scala 中跳过流中的无效字符?

如何确保 java8 流中的处理顺序?

如何在 C# 流中模拟 Java Scanner 的 next() 方法?