0

ArrayList 中存储了一个原始文本。要从顶部清除不需要的行,我需要找到包含某个标签的字符串的索引。

标签不是一个完整的字符串,只是一个子字符串。这意味着我不能使用 myArrayList.indexOf("start marker")
(indexOf 只查找完整的字符串)

我试图在流上放置一个计数器,计算它处理的字符串,直到找到标记,但它不起作用。

使用 for 循环我可以找到索引,但这既慢又难看(也给出了一些内存错误)。

通过过滤器流式传输 ArrayList,并让流返回包含标记的字符串,这为我提供了我正在寻找的完整字符串。拥有完整的字符串会启用 ArrayList.indexOf 方法。

总而言之,它现在可以工作了,但我仍然想知道如何在流上设置计数器。

For-loop(有效但丑陋):

    for(String s : myArrayList)
    {
        if(s.contains("marker text"))
        {
            break;
        }
        else counter++;
    }

找到完整的字符串(体面的解决方法):

    String markerText = myArrayList.stream().filter(s -> s.contains("marker text")).
    findFirst().orElse("marker not found");
    int x = myArrayList.indexOf(markerText); 

这不起作用:

    int counter = 0;
    myArrayList.stream().peek(counter++).
    filter(s -> s.contains("marker text")).findFirst();

这不会编译,因为 peek() 拒绝对整数 x 进行操作。

我还尝试将 x 转换为 AtomicInteger 并调用 getAndIncrement() 方法。这也不起作用。

我看到很多类似的主题,但他们都使用foreach方法。有人可以告诉我我做错了什么吗?

4

1 回答 1

1

您可以使用以下命令在一行中获取索引IntStream

OptionalInt index = IntStream.range(0, list.size()).filter(i -> list.get(i).contains("marker text")).findFirst();

然后使用它:

if(index.isPresent())
    System.out.println("I found " + list.get(index.getAsInt()) + "!");
else
    System.out.println("I didn't find any match!");
于 2019-05-30T01:15:21.363 回答