首页 » Program » JAVA 统计输入字符串单词个数
八月
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));
		}

	}

}

运行结果如图所示:
WordCnt

需要注意的是:由于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>();
}

如果你有效率更高的解决方法,也欢迎你来告诉我 :???:

, , ,

分享和收藏:转贴到开心网 转贴到人人网 分享到 Google Reader 分享到豆瓣 添加到QQ书签 添加到百度收藏

发表评论

评论审核已启用。您的评论可能需要一些时间才会显示。