南瓜慢说官方网站

  • 首页
  • 所有文章
  • 容器技术
  • SpringBoot-Cloud
  • 程序人生
  • 其它
  • 整理
  • 关于

  • 搜索
中间件 config Go Private Kubernetes pkslow Test HTTPS Redis Docker Mac 计划 Stream MongoDB Spring DevOps JVM String Map Set List 性能 Email Springboot 集合类 ArrayList Java
技术之前,先读诗书:

统计String单词数的三种方法

发表于 2019-10-08 | 分类于 Java基础 | 0 | 阅读次数 154

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

1 方法一:使用split

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

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

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

2 方法二:使用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 对象,并提供一个指定的分隔符,同时,指定是否返回分隔符。

3 方法三:使用原始的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';
}

4 测试代码

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

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));
    }
}

5 总结

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


欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

file

推荐阅读:
如何制定切实可行的计划并好好执行
容器技术(Docker-Kubernetes)
SpringBoot-Cloud相关
Https专题

  • 本文作者: 南瓜慢说
  • 本文链接: https://www.pkslow.com/archives/java-oneline-string-wordcount
  • 版权声明: 本博客所有文章除特别声明外,不可转载!
# 中间件 # config # Go # Private # Kubernetes # pkslow # Test # HTTPS # Redis # Docker # Mac # 计划 # Stream # MongoDB # Spring # DevOps # JVM # String # Map # Set # List # 性能 # Email # Springboot # 集合类 # ArrayList # Java
中间件 config Go Private Kubernetes pkslow Test HTTPS Redis Docker Mac 计划 Stream MongoDB Spring DevOps JVM String Map Set List 性能 Email Springboot 集合类 ArrayList Java
Java 8之条件断言Predicate的使用
使用正则统计英文文章中的高频词汇
  • 文章目录
  • 站点概览
南瓜慢说

南瓜慢说

多年Java开发,主要专注后端技术:Java/Spring/Springboot/微服务/大数据等。

多读书,多分享;多写作,多整理。

152 日志
7 分类
27 标签
RSS
0%
© 2020 — 2021 南瓜慢说 本站已挣扎运行:   粤ICP备20036375号