我有一些字符串,比如"paddington road",我需要从这个字符串中提取单词"road"。我该怎么做?
问题是,我需要处理一份街道列表,并提取一些单词,如"路"、"公园"、"街道"、"林荫大道"等。
最好的方法是什么?复杂性是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()
}
}
你觉得怎么样?
您可以尝试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是街道上所有单词的数量。
在外循环的每次迭代中,您需要为关键字列表获取一个新的迭代器。最简单的方法是使用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对于一台电脑来说不算什么,而街道名称是短字符串。如果将最频繁的关键字(street,而不是boulevard)放在关键字列表的开头,则迭代次数会减少。
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保存在列表或字符串缓冲区等中…