【问题标题】:Text tokenizer - extract words and positions from text文本标记器 - 从文本中提取单词和位置
【发布时间】:2015-02-09 10:02:54
【问题描述】:

我有Setcharacter 分隔符(DELIMITERS),例如. , 等。使用它我想拆分文本并获取带有它们在文本中的位置的单词。 如果您只想要文字,String.split() 可以正常工作。与StringTokenizer 相同。写了一些简单的方法来解决这个问题,但也许有更好的方法来实现这个结果?

public List<String> extractWords(String text){
    List<String> words = new ArrayList<>();
    List<WordPos> positions = new ArrayList<>();
    int wordStart = -1;
    for(int i=0; i < text.length(); i++){
        if(DELIMITERS.contains(text.charAt(i))){
            if(wordStart >=0){ //word just ended
                String word = text.substring(wordStart, i);
                positions.add(new WordPos(wordStart, i));
                words.add(word);
            }
            wordStart = -1;
        }else{ //not delimiter == valid word
            if(wordStart < 0){ //word just started
                wordStart = i;
            }
        }
    }
    return words;
}

// inner static class for words positions
public static class WordPos{
    int start;
    int end;
    public WordPos(int start, int end){
        this.start = start;
        this.end = end;
    }
}

【问题讨论】:

标签: java string tokenize string-split


【解决方案1】:

从效率的角度来看,我认为您的解决方案还不错。 从美学方面(代码看起来如何),我会使用Apache Commons nStringUtils 做类似的事情(还没有尝试过):

  1. 使用以下方式吐出所有令牌: splitPreserveAllTokens()
  2. 遍历生成的数组并存储令牌和我将从调用 lastIndexOf 获得的每个令牌的位置。

【讨论】:

  • @silvaran,您没有阅读我回答的第一句话吗?我并不是说性能明智是最好的做法……但是,性能并未明确提及为目标。我认为从“干净代码”的角度来看,最好让它既苗条又可读。
【解决方案2】:
List<String> words = new ArrayList<>();
List<WordPos> positions = new ArrayList<>();
int index = 0;
String word = "";
StringTokenizer st = new StringTokenizer("., ");


while(st.hasMoreTokens()) {

word = st.nextToken();
words.add(word);
positions.add(new WordPos(index,index+word.length()));

index+= word.length() +1;
}

使用上述方法,我想没有 2 个连续的分隔符。如果发生这种情况,方法是完全一样的。

【讨论】:

  • 但可能有两个分隔符。 “约翰回家了。天空是蓝色的。”点和空间在一起。
  • @bartektartanus 有固定的分隔符集还是可以改变?
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
相关资源
最近更新 更多