【问题标题】:Java Lambda | Find position first occurrence of an array of strings in a stringJava 拉姆达 |查找字符串数组中第一次出现的位置
【发布时间】:2020-02-11 09:22:02
【问题描述】:

我想构建一个方法int getIndexOfFirstFound(String text, String[] words)

该方法接收文本和单词数组,并应返回找到的第一个单词的索引。

我知道用简单的迭代来做,像这样:

for (String word : words) {
    if (text.indexOf(word) != -1) return text.indexOf(word);
}
return -1;

但是对于我的培训,如果可能的话,我会看看如何使用 lambda 来做...... 我知道我可以检查字符串是否包含数组中的单词:Arrays.stream(words).parallel().anyMatch(text::contains) 但我不知道如何返回索引..

很高兴知道如何以现代方式找到第一个找到的单词索引,谢谢!

附注示例:

Text = "你好,我是你的短信,你好吗?" Words = [“你的”,“是”]

结果应该是“你的”(10)的索引

【问题讨论】:

    标签: java lambda java-8


    【解决方案1】:

    你的 for 循环最简单的等价物是

    int getIndexOfFirstFound(String text, String[] words) {
        return Arrays.stream(words)
                .mapToInt(text::indexOf)
                .filter(i -> i >= 0)
                .findFirst()
                .orElse(-1);
    }
    

    【讨论】:

    • 非常感谢!工作出色且易于理解:)
    • 这将返回字符串中数组中第一个字符串的索引。首先按照数组的顺序不在文本中的索引中。它与您的代码相同,但不是我理解您的要求的方式。
    • @Nicktar 给出的示例与循环代码的代码相匹配,所以我猜需求的描述需要编辑。
    • @Nicktar,不太了解差异。但看起来这就是我要找的东西..
    • @AsfK 看到我的回答,这很想发表评论。
    【解决方案2】:

    结果与您的代码不同,但更接近我对您的要求的理解

    int getIndexOfFirstFound(String text, String[] words) {
        return Arrays.stream(words)
                .mapToInt(text::indexOf)
                .filter(i -> i >= 0)
                .sorted()
                .findFirst()
                .orElse(-1);
    }
    

    区别:

    Text = "你好,我是你的短信,你好吗?" Words = [“是”,“你的”]

    您的代码将返回 25('are' 的索引),我的代码将返回 10('your' 的索引)

    【讨论】:

    • 实际上我不在乎订单,所以最诚恳的回答对我有好处。也谢谢你!关注点很好!
    【解决方案3】:

    我认为为了使用非流版本获得更好的性能,您可以这样做:

    如果words的长度不是那么多,则不需要使用wordsSet

    int getIndexOfFirstFound(String text, String[] words) {
        int index = 0;
        Set<String> wordsSet = new HashSet<>(Arrays.asList(words));
        for (String w : text.split("\\s")) {
            if (wordsSet.contains(w)) break;
            index += (w.length()) + 1; // 1 is for the space between words in the text.
        }
        return index;
    }
    

    【讨论】:

    • 喜欢它:) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 2017-11-12
    相关资源
    最近更新 更多