从字符串中提取令牌

时间:2012-01-11 22:28:10

标签: java stringtokenizer

我有一些像“paddington road”这样的字符串,我需要从这个字符串中提取“road”这个词。我怎样才能做到这一点?

问题在于我需要处理一系列街道并提取一些词语,如“道路”,“公园”,“街道”,“林荫大道”等等。

最好的方法是什么?复杂性为O(n * m),如果您认为我处理的街道超过5000,那么性能应该非常重要。

我正在从Postgres数据库中提取值并放入List但是我不确定它是最好的方法,可能是哈希表查询速度更快?

我试过这样的事情:

    // 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 个答案:

答案 0 :(得分: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 :(得分: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是街道中所有单词的数量。

答案 2 :(得分: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保存在列表或字符串缓冲区等中....

相关问题