2012-01-11 4 views
0

У меня есть такие строки, как «paddington road», и мне нужно извлечь слово «дорога» из этой строки. Как я могу это сделать?Извлечение токена из строки

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

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

Я извлекаю значения из db 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()    
     }    
    } 

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

+0

Когда вы говорите, что вы хотите «извлечь» эти слова. Вам нужно что-либо делать со словами, которые вы «извлекаете», или просто хотите удалить их из строки? –

+0

Считаете ли вы, что включение этого условия в запрос select приведет к сложности? –

+0

Почему бы не использовать подстроку() в сочетании с методами indexof()? вы можете выполнить ту же операцию с извлечением строки с использованием SQL-запроса в postgres, у нее также есть подстрока() и strpos() –

ответ

1

Вы можете попробовать 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 (п), где п число всех слов на улицах.

1

Вам нужно получить новый итератор для вашего списка ключевых слов на каждой итерации внешнего цикла. Самый простой способ - использовать синтаксис 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 - ничто для компьютера, а названия улиц - короткие строки. И если вы поместите наиболее часто используемые ключевые слова (улица, а не бульвар) в начале списка ключевых слов, у вас будет меньше итераций.

1
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 в виде списка или строки буфера и т.д. ....

Смежные вопросы