1. 程式人生 > >JAVA實現EXCEL公式專題(七)——統計函數

JAVA實現EXCEL公式專題(七)——統計函數

length trace trac 復雜 manage 排列 public ram script

統計函數主要實現的是較為復雜的統計函數如countif、sumif、frequency,也是,直接上代碼
/**
 *  項目名稱:
 *  文件說明:
 *  主要特點:文件說明:EXCEL函數類型:統計函數
 *  簡單的函數如sum,average等等就不實現了
 *  版本:1.0
 *  制作人:劉晨曦
 *  創建時間:2013-12-3
 **/
package EXCEL;

import games.MathTools;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

/**
 * @author lcx
 *
 */
public class CountFunctions {

	/**
	 * 統計滿足條件的個數
	 * @param range
	 * @param criteria
	 * @return
	 */
	public static int sumif(int[][] range,String criteria)
	{
		ScriptEngineManager man=new ScriptEngineManager();
		ScriptEngine engine=man.getEngineByName("javascript");
		int sum=0;
		for(int i=0;i<range.length;i++)
			for(int j=0;j<range[0].length;j++)
			{
				try {
					Boolean b=(Boolean) engine.eval(range[i][j]+criteria);
					if(b)
						sum+=range[i][j];
				} catch (ScriptException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		return sum;
	}

	/**
	 * 統計滿足條件的個數
	 * @param range
	 * @param criteria
	 * @return
	 */
	public static int  countif(int[][] range,String criteria)
	{
		ScriptEngineManager man=new ScriptEngineManager();
		ScriptEngine engine=man.getEngineByName("javascript");
		int count=0;
		for(int i=0;i<range.length;i++)
			for(int j=0;j<range[0].length;j++)
			{
				try {
					Boolean b=(Boolean) engine.eval(range[i][j]+criteria);
					if(b)
						count++;
				} catch (ScriptException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		return count;
	}

	public static void sort()
	{
		System.out.println("給array和tags排序");
	}

	/**
	 * 為簡化處理,在這裏邊需保證輸入的是升序排列的數組
	 * @param array
	 * @param tags
	 * @return
	 */
	public static int[] frequency(int [] array,int[] tags)
	{
		sort();//排序,在這裏就不實現了
		if(array==null||tags==null||array.length==0||array.length==0)
			throw new IllegalArgumentException("數組為空");
		int[] res=new int[tags.length+1];
		int count=0;

		for(int i=0;i<array.length;i++)
		{
			if(count>=tags.length)
				break;
			if(array[i]<=tags[count])
				res[count]+=1;
			else 
			{
				i--;
				count++;
			}
		}
		//剩余的
		int sum=0;
		for(int i=0;i<res.length-1;i++)
			sum+=res[i];
		res[res.length-1]=array.length-sum;
		return res;
	}

	public static void main(String[] args) {

		/*******************測試數組相關*****************************/
		int [][]a={{1,2},{3,4},{5,6}};
		//		countif(a,"<=2");
		//		System.out.println(rank(3,a,true));
		System.out.println(sumif(a,"<=2"));

		int[] b={15,25,35,45,55,65,75,85,95};
		MathTools.printArray(frequency(b,new int[]{10,90}));
	}
}

JAVA實現EXCEL公式專題(七)——統計函數