八月
30
JAVA 统计输入字符串单词个数
在一个项目中需要实现一个统计用户输入字符串中单词个数的功能,例如:
用户输入:
aaa ddd bbb
ccc;ddd;aaa
afa;&*(eee
eee*&aaa
打印输出:
aaa : 3
afa : 1
bbb : 1
ccc : 1
ddd : 2
eee : 2
注意事项:
1. 统计所输入字符串的单词个数(大小写字母和数字均构成单词)
2. 空行后开始显出输出
3. 输出的单词统计需按字典顺序(a-z)排序
由于打印输出时要求按照字典顺序输出,在使用存储结构时,我开始想到了TreeMap。下面是我用TreeMap完成的实现方案:
/**
* Author: Beck
* Date: 2010-08-30
* Version: 1.0
*/
import java.util.*;
import java.util.regex.*;
import java.io.*;
public class WordCnt {
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
System.out.println("Please input words:");
StringBuffer sb = new StringBuffer();
String line = null;
//Read input streams till line is null.
while ((line = br.readLine()) != null) {
sb.append(line);
if (line.length() == 0) {
break;
}
}
//Using expression pattern to get words.
Pattern expression = Pattern.compile("[a-zA-Z0-9]+");
String s = sb.toString();
Matcher matcher = expression.matcher(s);
//In this version, using TreeMap to put keys and values.
TreeMap<Object, Integer> myTreeMap = new TreeMap<Object, Integer>();
int n = 0;
Object word = null;
Object num = null;
//Counting words.
while (matcher.find()) {
word = matcher.group();
n++;
if (myTreeMap.containsKey(word)) {
num = myTreeMap.get(word);
Integer count = (Integer) num;
myTreeMap.put(word, new Integer(count.intValue() + 1));
} else {
myTreeMap.put(word, new Integer(1));
}
}
//Output statistics.
System.out.println("Total words: " + n);
Iterator<Object> iter = myTreeMap.keySet().iterator();
Object key = null;
while (iter.hasNext()) {
key = iter.next();
System.out.println((String) key + ":" + myTreeMap.get(key));
}
}
}
运行结果如图所示:

需要注意的是:由于TreeMap使用的是红黑树的数据结构,在每Add一个key时都会进行一次排序计算,导致整个算法的性能不是很高。因此我在接下来的改进的解决方案中使用了Map来进行存储,到最后排序时,才对Map中的key进行一次sort。代码如下:
/**
* Author: Beck
* Date: 2010-08-30
* Version: 1.1
*/
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class WordCnt {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
WordCounter counter = new WordCounter();
String s = null;
while((s = br.readLine()) != null) {
if(s.length() == 0) {
br.close();
break;
}
counter.add(s);
}
counter.printResult();
}
}
class WordCounter {
public WordCounter() {
}
public void add(String line) {
StringBuffer sb = new StringBuffer();
for(int i = 0; i < line.length(); i++) {
boolean add = false;
char c = line.charAt(i);
if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') {
sb.append(c);
if(i == line.length() - 1) {
add = true;
}
}
else {
add = true;
}
if(add && sb.length() > 0) {
String word = sb.toString();
Integer count = map.get(word);
if(count == null) {
map.put(word, 1);
}
else {
map.put(word, ++count);
}
sb = new StringBuffer();
}
}
}
public void printResult() {
Set keySet = map.keySet();
String[] keys = new String[keySet.size()];
keySet.toArray(keys);
Arrays.sort(keys);
for(int i = 0; i < keys.length; i++) {
System.out.println(keys[i] + " : " + map.get(keys[i]));
}
}
private Map<String, Integer> map = new HashMap<String, Integer>();
}
如果你有效率更高的解决方法,也欢迎你来告诉我





