Есть ли более эффективный способ, чем String.split (), разбить строку на слова? - PullRequest
1 голос
/ 08 ноября 2010

Мой текущий проект требует запуска поиска по тексту песни, который является полем String в объекте Song. Чтобы сделать поиск более эффективным, я создаю лирические слова в набор при создании объекта песни, используя String.split("[^a-zA-Z]");, чтобы создать массив строк, а затем добавляю в набор.

Есть ли конкретный способ добавить слова в набор без промежуточного шага создания массива?

Ответы [ 4 ]

1 голос
/ 09 ноября 2010

Вы ищете какие-нибудь слова в конкретной песне?Если это так, вам может не понадобиться набор для этого, вы можете запустить поиск только с того момента, как получили текст.Для этого вы можете использовать обычное регулярное выражение, это может быть немного быстрее, чем разбивать строку, помещать ее в набор и запрашивать набор:

public class RegexpExample {

public static void main(String[] args) {
    String song = "Is this a real life? Is this just fantasy?";
    String toFind = "is";

    Pattern p = Pattern.compile(toFind, Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher(song);

    while (m.find()) {
        String found = m.group();
        int startIndex = m.start();
        int endIndex = m.end();

        System.out.println(found + " at start " + startIndex + ", end " + endIndex);
        //do something with this info...
    }
}

Будет выведено следующее:

Is at start 0, end 2
is at start 5, end 7
Is at start 21, end 23
is at start 26, end 28

Если вы ищете в разных песнях, вы можете объединить их тексты, используя StringBuilder, затем вызвать StringBuilder#toString и выполнить всю операцию с результатом toString метода

1 голос
/ 09 ноября 2010

Есть ли конкретный способ добавить слова в набор без промежуточного шага создания массива?

Конечно, вы могли бы написать метод, который возвращает объект Iterator, который выдает одно слово за раз.

Но что-то подобное действительно не стоит оптимизировать.Ваш массив будет достаточно маленьким, чтобы поместиться в память, его создание не будет таким дорогим, и сборщик мусора впоследствии его очистит.

0 голосов
/ 09 ноября 2010

Я не знаю об эффективности, но поочередно, вы можете сделать это так:

0 голосов
/ 09 ноября 2010
StringTokenizer st = new StringTokenizer("the days go on and on without you here");
HashSet<String> words = new HashSet<String>();
while (st.hasMoreTokens()) {
    words.add(st.nextToken());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...