Java 从字符串中提取令牌

Java 从字符串中提取令牌,java,stringtokenizer,Java,Stringtokenizer,我有一些字符串,比如“paddington road”,我需要从这个字符串中提取单词“road”。我该怎么做 问题是我需要处理一个街道列表,并提取一些单词,如“road”、“park”、“street”、“boulevard”等 最好的方法是什么?复杂性是O(n*m),如果你考虑我处理超过5000条街道,性能应该是非常重要的。 我正在从Postgres db中提取值并将其放入列表中,但我不确定这是否是最好的方法,是否哈希表的查询速度更快 我试过这样的方法: // Parse select

我有一些字符串,比如“paddington road”,我需要从这个字符串中提取单词“road”。我该怎么做

问题是我需要处理一个街道列表,并提取一些单词,如“road”、“park”、“street”、“boulevard”等

最好的方法是什么?复杂性是O(n*m),如果你考虑我处理超过5000条街道,性能应该是非常重要的。 我正在从Postgres db中提取值并将其放入列表中,但我不确定这是否是最好的方法,是否哈希表的查询速度更快

我试过这样的方法:

    // 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()              
        }               
    }
//解析selectedList
Iterator it=streets.Iterator();
迭代器it_exception=exception.Iterator();
int counter=streets.size();
而(it.hasNext()){
while(it_exception.hasNext()){
//从中删除子字符串it\u exception.next().next()
}               
}

您认为如何?

在外循环的每次迭代中,您需要为关键字列表获取一个新的迭代器。最简单的方法是使用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)放在关键字列表的开头,则迭代次数会减少。

在外循环的每次迭代中,您需要为关键字列表获取一个新的迭代器。最简单的方法是使用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)放在关键字列表的开头,则迭代次数会减少。

您可以尝试
设置

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);
}
Set exceptions=newhashset(…);
适用于(字符串街:街道){
String[]words=street.split(“”);
StringBuilder res=新的StringBuilder();
for(字符串字:字){
如果(!exceptions.contains(word)){
res.append(word).append(“”);
}
} 
系统输出打印项次(res);
}

我认为复杂性将是O(n),其中n是街道上所有单词的数量。

您可以尝试
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);
}
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);

    }
Set exceptions=newhashset(…);
适用于(字符串街:街道){
String[]words=street.split(“”);
StringBuilder res=新的StringBuilder();
for(字符串字:字){
如果(!exceptions.contains(word)){
res.append(word).append(“”);
}
} 
系统输出打印项次(res);
}
我认为复杂性将是O(n),其中n是街道中所有单词的数量。

List streets=new ArrayList();
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);

    }
街道。添加(“帕丁顿路”); 街道。添加(“帕丁顿公园”); 用于(对象:街道){ 字符串cmpstring=object.toString(); 字符串[]abc=cmpstring.split(“”); 字符串secondwrd=abc[1]; System.out.println(“secondwrd”+secondwrd); }
您可以将secondwrd保存在列表或字符串缓冲区等中……

list streets=new ArrayList();
街道。添加(“帕丁顿路”);
街道。添加(“帕丁顿公园”);
用于(对象:街道){
字符串cmpstring=object.toString();
字符串[]abc=cmpstring.split(“”);
字符串secondwrd=abc[1];
System.out.println(“secondwrd”+secondwrd);
}

当您说要“提取”这些单词时,可以将secondwrd保存在列表或字符串缓冲区等中。您是否需要对正在“提取”的单词执行任何操作,或者只是想从字符串中删除它们?您认为将该条件放入select查询本身会增加复杂性吗?为什么不将substring()与indexof()方法结合使用?您可以在postgres中使用SQL查询来提取字符串执行相同的操作。当您说要“提取”这些单词时,它还有一个子字符串()和strps()。您是否需要对正在“提取”的单词执行任何操作,或者只是想从字符串中删除它们?您认为将该条件放入select查询本身会增加复杂性吗?为什么不将substring()与indexof()方法结合使用?您可以在postgres中使用SQL查询来提取字符串,也可以执行相同的操作。它还有一个子字符串()和strpos()