使用Java Fork / Join使用并行性在字符串中搜索单词

问题描述 投票:1回答:3

假设我想以并行方式搜索字符串中某个单词的出现。假设我们有一个字符串“你好,我是鲍勃,我的名字是鲍勃”和一个单词“鲍勃”。该函数需要返回2。

依次完成此操作非常容易。我们只需要使用一个for循环来遍历我们的字符串并在我们的单词与字符串中的另一个单词匹配时进行计数。

我正在尝试使用并行性解决此问题。我考虑过在每个空白处分割字符串并将单词传递给每个线程,然后线程将检查它是否与我们搜索的单词匹配。但是,在我们的字符串中查找空格仍然是按顺序进行的。因此,并行性在这里无益。

还有其他方法可以实现这一目标吗?

java parallel-processing fork-join
3个回答
1
投票

这不是fork联接要解决的问题,因为这不是递归操作。流API是前往此处的方法:

String str = "Hello i am bob and my name is bob";
long count = Arrays.stream(str.split("\\s+"))
        .parallel()
        .filter(s -> s.equals("bob"))
        .count();
System.out.println("Bob appeared " + count + " times");

0
投票

我曾考虑过在每个空白处分割字符串并传递每个线程的词,然后将检查它是否与我们的匹配搜索的单词。但是,在我们的字符串中寻找空格是仍按顺序进行。

您可以使用String:split分割字符串

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String str = "Hello i am bob and my name is bob";
        String[] arr = str.split("\\s+");
        System.out.println(Arrays.toString(arr));
    }
}

输出:

[Hello, i, am, bob, and, my, name, is, bob]

您可以使用Java regex API搜索所需的字符串,例如。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String str = "Hello i am bob and my name is bob";
        Pattern pattern = Pattern.compile("\\bbob\\b");
        Matcher matcher = pattern.matcher(str);
        boolean found = false;
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
    }
}

输出:

bob
bob

0
投票

您可以执行str.indexOf(“ bob”)!= str.lastIndexOf(“ bob”)。如果不相等,您有两个。您可以通过删除第一个bob进行另一个检查,最后一个bob成为第一个索引,如果通过indexOf!= lastIndexOf找到另一个,则再次删除第一个bob并继续搜索直到完成。我敢肯定,还有一种方法可以使它变得更好。

© www.soinside.com 2019 - 2024. All rights reserved.