Java如何獲取字符串單詞個(gè)數(shù)
Java獲取字符串單詞個(gè)數(shù)
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("我愛(ài)你 zhanglulu _")); // 輸出5,單詞是以空格分開(kāi),所以這里我愛(ài)你三個(gè)字加一個(gè)單詞zhanglulu和一個(gè)下劃線,空格不算。 }
統(tǒng)計(jì)String單詞數(shù)的三種方法
統(tǒng)計(jì)字符串里包含有多少個(gè)單詞,這是Java代碼常用的場(chǎng)景。介紹三種簡(jiǎn)單的方法來(lái)對(duì)其進(jìn)行統(tǒng)計(jì)。這里所謂的單詞,是指連續(xù)的非空字符串。如“Hello”則為一個(gè)詞,“I love Guangzhou”則為三個(gè)詞。
方法一:使用split
在類(lèi)String中,有split()這個(gè)方法,可以將字符進(jìn)行分割。可以通過(guò)對(duì)字符串以空白字符進(jìn)行分割,則可以得到結(jié)果。
public int countWithSplit(String str) { ? ? if (Strings.isNullOrEmpty(str)) { ? ? ? ? return 0; ? ? } ? ? return str.split("\\s+").length; }
代碼中"\\s+"為正則表達(dá)式,表示所有的空白字符。
方法二:使用StringTokenizer
public int countWithStringTokenizer(String str) { ? ? if (Strings.isNullOrEmpty(str)) { ? ? ? ? return 0; ? ? } ? ? StringTokenizer tokenizer = new StringTokenizer(str); ? ? return tokenizer.countTokens(); }
StringTokenizer是一個(gè)很有用的類(lèi),構(gòu)造函數(shù)有三個(gè):
- 1. StringTokenizer(String str) :構(gòu)造一個(gè)用來(lái)解析 str 的 StringTokenizer 對(duì)象。java 默認(rèn)的分隔符是空格("")、制表符(\t)、換行符(\n)、回車(chē)符(\r)。
- 2. StringTokenizer(String str, String delim) :構(gòu)造一個(gè)用來(lái)解析 str 的 StringTokenizer 對(duì)象,并提供一個(gè)指定的分隔符。
- 3. StringTokenizer(String str, String delim, boolean returnDelims) :構(gòu)造一個(gè)用來(lái)解析 str 的 StringTokenizer 對(duì)象,并提供一個(gè)指定的分隔符,同時(shí),指定是否返回分隔符。
方法三:使用原始的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; ? ? ? ? ? ? ? // 非空字符后遇到空字符,則數(shù)量加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'; }
測(cè)試代碼
簡(jiǎn)單寫(xiě)了幾個(gè)測(cè)試用例,測(cè)試通過(guò)。
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)); ? ? } }
這三種方法都非常簡(jiǎn)單,沒(méi)有什么技術(shù)難點(diǎn),用到了String、StringTokenizer、正則、Guava、JUnit等,非?;A(chǔ)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud Alibaba項(xiàng)目實(shí)戰(zhàn)之nacos-server服務(wù)搭建過(guò)程
Nacos 是阿里巴巴推出來(lái)的一個(gè)新開(kāi)源項(xiàng)目,這是一個(gè)更易于構(gòu)建云原生應(yīng)用的動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺(tái)。本章節(jié)重點(diǎn)給大家介紹SpringCloud Alibaba項(xiàng)目實(shí)戰(zhàn)之nacos-server服務(wù)搭建過(guò)程,感興趣的朋友一起看看吧2021-06-06Maven腳手架如何基于jeecg實(shí)現(xiàn)快速開(kāi)發(fā)
這篇文章主要介紹了Maven腳手架如何基于jeecg實(shí)現(xiàn)快速開(kāi)發(fā),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10JDK8中新增的原子性操作類(lèi)LongAdder詳解
這篇文章主要給大家介紹了關(guān)于JDK8中新增的原子性操作類(lèi)LongAdder的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08Java并發(fā)編程之阻塞隊(duì)列(BlockingQueue)詳解
這篇文章主要介紹了詳解Java阻塞隊(duì)列(BlockingQueue)的實(shí)現(xiàn)原理,阻塞隊(duì)列是Java util.concurrent包下重要的數(shù)據(jù)結(jié)構(gòu),有興趣的可以了解一下2021-09-09Java Swing實(shí)現(xiàn)JTable檢測(cè)單元格數(shù)據(jù)變更事件的方法示例
這篇文章主要介紹了Java Swing實(shí)現(xiàn)JTable檢測(cè)單元格數(shù)據(jù)變更事件的方法,結(jié)合完整實(shí)例形式分析了Swing實(shí)現(xiàn)JTable檢測(cè)單元格數(shù)據(jù)變更事件過(guò)程中出現(xiàn)的問(wèn)題與相關(guān)解決方法,需要的朋友可以參考下2017-11-11Servlet會(huì)話(huà)技術(shù)基礎(chǔ)解析
這篇文章主要介紹了Servlet會(huì)話(huà)技術(shù)基礎(chǔ)解析,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12Mybatis-plus配置多數(shù)據(jù)源,連接多數(shù)據(jù)庫(kù)方式
這篇文章主要介紹了Mybatis-plus配置多數(shù)據(jù)源,連接多數(shù)據(jù)庫(kù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06springboot通過(guò)jar包啟動(dòng)中文日志亂碼問(wèn)題及解決
這篇文章主要介紹了springboot通過(guò)jar包啟動(dòng)中文日志亂碼問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06