Поиск слова в строке с использованием параллелизма с Java Fork / Join - PullRequest
1 голос
/ 08 мая 2020

Допустим, я хочу найти вхождение слова в строке параллельным способом. Скажем, например, у нас есть строка «Привет, я Боб, меня зовут Боб» и слово «Боб». Функция должна вернуть 2.

Последовательно добиться этого довольно просто. Нам просто нужно использовать a for l oop to go над нашей строкой и считать всякий раз, когда наше слово соответствует другому слову в строке.

Я пытаюсь решить эту проблему с помощью параллелизма. Я подумал о разделении строки на каждом пробеле и передаче слова в каждый поток, который затем проверит, соответствует ли оно нашему искомому слову. Однако поиск пробелов в нашей строке по-прежнему выполняется последовательно. Итак, параллелизм здесь не может быть полезен.

Есть ли другой способ добиться этого?

Ответы [ 3 ]

1 голос
/ 08 мая 2020

Это не проблема, которую следует решить с помощью fork join, поскольку это не рекурсивное действие. Stream api - это путь к go здесь:

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 голосов
/ 08 мая 2020

Вы можете сделать str.indexOf («bob»)! = Str.lastIndexOf («bob»). Если они не равны, у вас есть два. Вы можете выполнить еще одну проверку, удалив первый боб, и последний боб становится первым индексом. Если вы найдете еще один по indexOf! = LastIndexOf, вы снова удалите первый и продолжите поиск, пока не закончите. Я уверен, что еще будет способ сделать это лучше.

0 голосов
/ 08 мая 2020

Я думал о разделении строки на каждом пробеле и передаче слова в каждый поток, который затем проверит, соответствует ли оно нашему искомому слову. Однако поиск пробелов в нашей строке все еще выполняется последовательно.

Вы можете разделить строку, используя 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 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
...