算法的简单描述:
有一个数组,里面的数据可能是重复的,比如:str[0]="a",str[1]="a",现在要实现一个算法,统计该str
数组中数据的取值空间是多少,各个值出现的次数是多少.改算法的描述如果在数据库中进行类似:
select count(*) count,value value from tab_name group by value
这里我实现了一个算法,但不知道效率如何:
java 代码
- package com.snow;
- import java.util.HashMap;
- import java.util.Map;
- /**
- *@author anwxAn Weixiao
- *@version $Id$
- */
- public class GroupBy {
- private String[] initData = null;
- private Map map = new HashMap();
- /**
- * 欲进行筛选的数据
- * @param data
- */
- public GroupBy(String[] data){
- if((data==null)||(data.length==0))
- this.initData = new String[]{};
- else
- this.initData = data;
- }
- /**
- * 进行一次全数据扫描
- *
- */
- private void scanData(){
- for(String key:initData){
- filterData(key);
- }
- }
- /**
- * 过滤并记录该数据出现的次数
- * @param data
- */
- private void filterData(String data){
- data = analyzeData(data);
- Integer count = map.get(data);
- if(count == null)map.put(data,1);
- else map.put(data,++count);
- }
- /**
- * 对数组中的数据进行必要的处理
- * @param data
- */
- private String analyzeData(String data){
- if((data==null)||(data.trim().length==0))data = "";
- else data = data.trim();
- return data;
- }
- /**
- * 执行分组操作
- * @return 排序后的结果集合
- */
- public Map groupBy(){
- scanData();
- //TODO do other business
- return map;
- }
- /**
- * 用于简单的测试,查看执行后的结果集
- * @param res
- */
- private void print(Map res){
- for(String key:res.keySet()){
- System.out.println(key+" has "+res.get(key));
- }
- }
- public static void main(String[] arg){
- GroupBy groupBy = new GroupBy(new String[]{"1","1","1","2","3","3"});
- Map res = groupBy.groupBy();
- groupBy.print(res);
- }
- }