Извлечение токена из строки - PullRequest
0 голосов
/ 12 января 2012

У меня есть несколько строк, подобных этой "дороге Паддингтона", и мне нужно извлечь слово "дорога" из этой строки.Как я могу это сделать?

Проблема в том, что мне нужно обработать список улиц и извлечь некоторые слова, такие как «дорога», «парк», «улица», «бульвар» и многие другие.

Что может быть лучшим способом сделать это?Сложность O (n * m), и если учесть, что я обрабатываю более 5000 улиц, производительность должна быть очень важной.

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

Я пробовал что-то вроде этого:

    // Parse selectedList
    Iterator<String> it = streets.iterator();
    Iterator<String> it_exception = exception.iterator();

    int counter = streets.size();
    while(it.hasNext()) {   

        while ( it_exception.hasNext() ) {
            // remove substring it_exception.next() from it.next()              
        }               
    }

Что вы думаете?

Ответы [ 3 ]

1 голос
/ 12 января 2012

Вы можете попробовать Set:

Set<String> exceptions = new HashSet<String>(...);
for (String street : streets) {
    String[] words = street.split(" ");
    StringBuilder res = new StringBuilder();
    for (String word : words) {
        if (!exceptions.contains(word)) {
            res.append(word).append(" ");
        }
    } 
    System.out.println(res);
}

Я думаю, сложность будет O (n), где n - количество всех слов на улицах.

1 голос
/ 12 января 2012
List streets = new ArrayList<String>();
    streets.add("paddington road");
    streets.add("paddington park");

    for (Object object : streets) {
        String cmpstring = object.toString();
        String[] abc = cmpstring.split(" ");
        String secondwrd = abc[1];
        System.out.println("secondwrd"+secondwrd);

    }

вы можете хранить secondwrd в списке или строковом буфере и т.д ....

1 голос
/ 12 января 2012

Вам нужно получить новый итератор для вашего списка ключевых слов на каждой итерации внешнего цикла. Самый простой способ - использовать синтаксис foreach:

for (String streetName : streets) {
    for (String keyword : keywords) {
        // find if the string contains the keyword, and perhaps break if found to avoid searching for the other keywords
    }
}

Не предоптимизируйте. 5000 - ничто для компьютера, а названия улиц - короткие строки. И если вы поместите наиболее часто встречающиеся ключевые слова (улица, а не бульвар) в начале списка ключевых слов, у вас будет меньше итераций.

...