两个字符串数组的Java比较

4

我有一个关于以高效的方式比较两个字符串数组的问题。我想知道stArr1中的哪个字符串包含了stArr2中的任何一个字符串。 如果是的话,我想要打印出我找到它的字符串和它在stArr1中的索引。

目前我得到的方法是比较两个字符串:

public class Main {

    public static void main(String[] args) {

        String[] stArr1 = {"I am testing", "hi", "bye bye"};
        String[] stArr2 = {"hello", "bye", "test"};

        int matches = 0;

        for (int i = 0; i < stArr1.length; i++) {
            for (int j = 0; j < stArr2.length; j++) {
                if (stArr1[i].contains(stArr2[j])) {
                    System.out.println(stArr1[i] + "found at index " i);
                }
            }
        }
    }
}

因此,输出应为:在索引0处找到“I am testing”,在索引2处找到“bye bye”。有人知道更好的方法吗?我尝试了一点流处理,相信有比那更好的解决方案。

对不起,我太匆忙了,没有花时间仔细审查这个问题,忘记我说的话吧,你的代码是正确和高效的,同时易于阅读和理解。 - Stacklysm
“_an efficient way_” 意味着最快的执行时间?最少的内存使用?还是最少的代码行数? - Kaan
@user85421 通过例子暗示了他们想要找到多个匹配项,因此应该检查所有字符串。 - WJS
1
有一个可能更有效的解决方案,但它与Stream API无关。你必须决定你的问题是关于Stream API解决方案还是更有效的方法。 - Holger
1个回答

3
您可以使用IntStream结合anyMatch运算符来完成此操作。流 API 非常灵活,可以使用流进行任何实用的计算。但是,仅仅因为您可以这样做,并不意味着您应该这样做。对我来说,我仍然更喜欢迭代方法,而且比起流方案,它更易读。因此,我的建议是保留迭代解决方案。
IntStream.range(0, stArr1.length)
    .filter(i -> Arrays.stream(stArr2).anyMatch(s -> stArr1[i].contains(s)))
    .forEach(i -> System.out.println(stArr1[i] + " found at index " + i));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接