2012-01-11 47 views
0

我有一些類似「paddington道路」的字符串,我需要從此字符串中提取「道路」一詞。我怎樣才能做到這一點?從字符串中提取令牌

問題是我需要處理一個街道列表並提取一些詞,如「道路」「公園」「街道」「林蔭大道」等等。

什麼可能是最好的辦法呢?複雜度爲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()    
     }    
    } 

你覺得呢?

+0

當你說你想「提取」這些話。你是否需要對你「提取」的單詞做任何事情,或者你只是想從字符串中刪除它們? – 2012-01-11 22:36:56

+0

您是否認爲在選擇查詢本身中添加該條件會增加複雜性? – 2012-01-11 22:37:00

+0

爲什麼不使用substring()和indexof()方法?你可以通過在postgres中使用SQL查詢來提取一個字符串來執行相同的操作,它也有一個substring()和strpos() – 2012-01-11 22:39:00

回答

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(n),其中n是一個數字的街道所有單詞。

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 
    } 
} 

不要preoptimize。 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列表或字符串緩衝區等....