从Java字符串中删除短单词和字符

3

输入字符串:

String input = "Lorem Ipsum is simply dummy text of the printing and typesetting industry";

输出字符串:

String output = "Lorem Ipsum simply dummy printing typesetting industry";

什么是最好的去除短词的方法?
这是我的第一个想法:
private String removeShortWords(String string){
    int minLength = 5;
    String result = "";

    String[] words = string.split("\\s+");

    for (int i = 0; i < words.length; i++){
        String word = words[i];
        if(word.length() >= minLength){
            result += word + " ";
        }
    }       

    return result;
}

3
定义“short”。目的是删除少于5个字符的任何单词吗? - PakkuDon
1
我建议使用 StringBuilder - ChiefTwoPencils
5个回答

9

一行代码:

String output = input.replaceAll("\\b\\w{1,4}\\b\\s?", "");

它会将“无法相信”变为“可以相信”。 - krinker

1
您的方法很好,但是有以下问题:
  • 在重建字符串时,您没有保留空格的数量。
  • 应该使用 StringBuilder 而不是 +=
  • 您在末尾添加了冗余空格。

我会这样做:

迭代字符串,只要我有一个 char,我就增加计数器并将 char 添加到一些临时字符串中,否则,我就有一个空格。我检查计数器的值,如果它是 <= 5,我不添加临时字符串,否则,我添加。这样我也保存了空格。

关于复杂度,当 n 是字符串的长度时,它的时间复杂度为 O(n),因为我们只遍历一次字符串。


1

你的方法可以,但出于性能考虑,最好使用StringBuilder,因为+=会在循环的每次迭代中创建它。还要注意Maroun的评论关于输出的完整性。

另一个选择是使用正则表达式,这个调用应该具有相同的效果:

return string.replaceAll("\\b\\w{1,4}\\b","");

注意,出于性能考虑,您需要预编译模式并重复使用它。

0

试试这段代码

          String input = "Lorem Ipsum is simply dummy text of the printing and typesetting industry";
            String[] dev=input.split(" ");
             for(int i=0;i<dev.length;i++)
              if(dev[i].length()<=2)
               input=input.replaceAll(dev[i], "");

0

尝试使用StringTokenizer而不是Split,并使用StringBuilder来创建结果

int minLength = 5;
StringTokenizer tokenizer = new StringTokenizer(input, " ");
StringBuilder builder = new StringBuilder();
  while(tokenizer.hasMoreTokens()){
    String token = tokenizer.nextToken();
    if(token.length() >= minLength){
    builder.append(token);
        builder.append(" ");
  }
}
return builder.toString();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接