Java如何获取字符串单词个数

 更新时间:2023年03月01日 10:31:45   作者:黄宝康  
这篇文章主要介绍了Java如何获取字符串单词个数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Java获取字符串单词个数

 public static int getWordCount(String content){
        int count = 0;
        String cn_words = content.replaceAll("[^(\\u4e00-\\u9fa5,。《》?;'‘:“”【】、)(……¥!·)]", "");
        int cn_words_count = cn_words.length();
        String non_cn_words = content.replaceAll("[^(a-zA-Z0-9`\\-=\';.,/~!@#$%^&*()_+|}{\":><?\\[\\])]", " ");
        int non_cn_words_count = 0;
        String[] temp = non_cn_words.split(" ");
        for(String ch:temp){
            if(ch.trim().length() != 0) non_cn_words_count++;
        }
        count = cn_words_count + non_cn_words_count;
        return count;
    }
    public static void main(String[] args) {
		System.out.println(getWordCount("我爱你 zhanglulu _")); // 输出5,单词是以空格分开,所以这里我爱你三个字加一个单词zhanglulu和一个下划线,空格不算。
	}

统计String单词数的三种方法

统计字符串里包含有多少个单词,这是Java代码常用的场景。介绍三种简单的方法来对其进行统计。这里所谓的单词,是指连续的非空字符串。如“Hello”则为一个词,“I love Guangzhou”则为三个词。

方法一:使用split

在类String中,有split()这个方法,可以将字符进行分割。可以通过对字符串以空白字符进行分割,则可以得到结果。

public int countWithSplit(String str) {
    if (Strings.isNullOrEmpty(str)) {
        return 0;
    }
    return str.split("\\s+").length;
}

代码中"\\s+"为正则表达式,表示所有的空白字符。

方法二:使用StringTokenizer

public int countWithStringTokenizer(String str) {
    if (Strings.isNullOrEmpty(str)) {
        return 0;
    }
    StringTokenizer tokenizer = new StringTokenizer(str);
    return tokenizer.countTokens();
}

StringTokenizer是一个很有用的类,构造函数有三个:

  • 1. StringTokenizer(String str) :构造一个用来解析 str 的 StringTokenizer 对象。java 默认的分隔符是空格("")、制表符(\t)、换行符(\n)、回车符(\r)。
  • 2. StringTokenizer(String str, String delim) :构造一个用来解析 str 的 StringTokenizer 对象,并提供一个指定的分隔符。
  • 3. StringTokenizer(String str, String delim, boolean returnDelims) :构造一个用来解析 str 的 StringTokenizer 对象,并提供一个指定的分隔符,同时,指定是否返回分隔符。

方法三:使用原始的char判断

public int countWithChar(String str) {
    if (Strings.isNullOrEmpty(str)) {
        return 0;
    }
    int wordCount = 0;
    boolean isWord = false;
    int endOfLine = str.length() - 1;
    char[] chars = str.toCharArray();
 
    for (int i = 0; i < chars.length; i++) {
        // 如果是非空字符, word = true.
        if (isWord(chars[i]) && i != endOfLine) {
            isWord = true;
 
            // 非空字符后遇到空字符,则数量加1
        } else if (!isWord(chars[i]) && isWord) {
            wordCount++;
            isWord = false;
            // 非空字符后遇到行尾
        } else if (isWord(chars[i]) && i == endOfLine) {
            wordCount++;
        }
    }
    return wordCount;
}
 
private boolean isWord(char c) {
    return c != ' '
            && c != '\t'
            && c != '\n'
            && c != '\r'
            && c != '\f';
}

测试代码

简单写了几个测试用例,测试通过。

public class CountWordTest {
    private CountWord countWord = new CountWord();
 
    @Test
    public void test() {
        testStringCount(null, 0);
        testStringCount("", 0);
        testStringCount(" ", 0);
        testStringCount(" \t\r\n\f", 0);
        testStringCount("0", 1);
        testStringCount("abcdef", 1);
        testStringCount("a b c", 3);
        testStringCount("a,b,c", 1);
        testStringCount("a\rb\nc", 3);
        testStringCount("a,b\t\nc", 2);
    }
 
    private void testStringCount(String str, int expectedCount) {
        assertEquals(expectedCount, countWord.countWithSplit(str));
        assertEquals(expectedCount, countWord.countWithStringTokenizer(str));
        assertEquals(expectedCount, countWord.countWithChar(str));
    }
}

这三种方法都非常简单,没有什么技术难点,用到了String、StringTokenizer、正则、Guava、JUnit等,非常基础。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java集成swagger文档组件

    Java集成swagger文档组件

    这篇文章主要介绍了Java集成swagger文档组件,通过详细的图文介绍和代码分析展示,从头展开说明详细的过程,希望对你的开发有所帮助
    2021-06-06
  • 深入理解java线程通信

    深入理解java线程通信

    开发中不免会遇到需要所有子线程执行完毕通知主线程处理某些逻辑的场景。或者是线程 A 在执行到某个条件通知线程 B 执行某个操作。下面我们来一起学习如何解决吧
    2019-05-05
  • Java 并发编程学习笔记之Synchronized底层优化

    Java 并发编程学习笔记之Synchronized底层优化

    这篇文章主要介绍了Java 并发编程学习笔记之Synchronized底层优化的相关资料,主要包含了重量级锁,轻量级锁,偏向锁和其他优化等方面,有需要的小伙伴可以参考下
    2016-05-05
  • JAVA8如何妙用Optional解决NPE问题详解

    JAVA8如何妙用Optional解决NPE问题详解

    在Java中,null代表一个不存在的对象,如果对它进行操作就会抛出java.lang.NullPointerException异常,下面这篇文章主要给大家介绍了关于JAVA8如何妙用Optional解决NPE问题的相关资料,需要的朋友可以参考下
    2018-06-06
  • SpringDataJPA之Specification复杂查询实战

    SpringDataJPA之Specification复杂查询实战

    这篇文章主要介绍了SpringDataJPA之Specification复杂查询实战,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 使用Java实现加密之AES加解密

    使用Java实现加密之AES加解密

    这篇文章主要介绍了使用Java实现加密之AES加解密,AES为最常见的对称加密算法,对称加密算法也就是加密和解密用相同的密钥,需要的朋友可以参考下
    2023-05-05
  • Java使用pulsar-flink-connector读取pulsar catalog元数据代码剖析

    Java使用pulsar-flink-connector读取pulsar catalog元数据代码剖析

    这篇文章主要介绍了Java使用pulsar-flink-connector读取pulsar catalog元数据代码剖析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • 详解Spring Boot中使用AOP统一处理Web请求日志

    详解Spring Boot中使用AOP统一处理Web请求日志

    本篇文章主要介绍了详解Spring Boot中使用AOP统一处理Web请求日志,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • JDK14之jpackage打包命令的使用

    JDK14之jpackage打包命令的使用

    这篇文章主要介绍了JDK14之jpackage打包命令的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • 详解Java数组的一维和二维讲解和内存显示图

    详解Java数组的一维和二维讲解和内存显示图

    这篇文章主要介绍了Java数组的一维和二维讲解和内存显示图,数组就相当于一个容器,存放相同类型数据的容器。而数组的本质上就是让我们能 "批量" 创建相同类型的变量,需要的朋友可以参考下
    2023-05-05

最新评论