1 package edu.psu.geovista.app.spreadsheet.functions;
2
3 import edu.psu.geovista.app.spreadsheet.formula.Node;
4 import edu.psu.geovista.app.spreadsheet.formula.Formula;
5 import edu.psu.geovista.app.spreadsheet.formula.Cell;
6 import edu.psu.geovista.app.spreadsheet.exception.ParserException;
7 import edu.psu.geovista.app.spreadsheet.exception.NoReferenceException;
8
9 import java.awt.*;
10
11 import edu.psu.geovista.app.spreadsheet.table.SSTable;
12 import edu.psu.geovista.app.spreadsheet.SpreadSheetBean;
13
14 /*
15 * Description:
16 * Date: Mar 26, 2003
17 * Time: 12:12:28 PM
18 * @author Jin Chen
19 */
20
21 public class FunctionMedian extends Function{
22 private SSTable tb;
23
24 public FunctionMedian(SSTable tb) {
25 this.tb = tb;
26 }
27
28 public Number evaluate( Node node) throws ParserException,NoReferenceException {
29 int index[]=new int[2];
30 Number result=null;
31 //Function fcf=Formula.getFuncHandler("FUN_COUNT");
32 Function fcf=tb.getFunManager().getFuncHandler("FUN_COUNT");
33 int nCells=fcf.evaluate(node).intValue() ;
34 SelectionRange fr=getRangeArea(node);
35 Point[] ps=fr.getRange() ;
36 //SSTable tb=SpreadSheetBean.getTableInstance() ;
37 if (fr.getType() ==SelectionRange.SINGLE_COLUMN ){
38 int vx0,vx1,vy;
39 vy=(int)ps[0].getY() ;
40 int sx=(int)ps[0].getX() ; //starting row
41 int ex=(int)ps[1].getX() ; //end row
42 int[] vx=this.getMedianIndex(sx,ex);
43 if (vx[1]==-1){//odd number of cells
44 result=(Number)((Cell)tb.getValueAtIndex(vx[0],vy)).getValue() ;
45 }
46 else{//even number of cells
47 Number r0=(Number)((Cell)tb.getValueAtIndex(vx[0],vy)).getValue() ;
48 Number r1=(Number)((Cell)tb.getValueAtIndex(vx[1],vy)).getValue() ;
49 float md=(r0.floatValue() +r1.floatValue() )/2;
50 result=new Float(md);
51 }
52 }
53 else if(fr.getType() ==SelectionRange.SINGLE_ROW ){
54 int vy0,vy1,vx;
55 vx=(int)ps[0].getX() ;
56 int sy=(int)ps[0].getY() ; //starting row
57 int ey=(int)ps[1].getY() ; //end row
58 int[] vy=this.getMedianIndex(sy,ey);
59 if (vy[1]==-1){//odd number of cells
60 result=(Number)((Cell)tb.getValueAtIndex(vx,vy[0])).getValue() ;
61 }
62 else{//even number of cells
63 Number r0=(Number)((Cell)tb.getValueAtIndex(vx,vy[0])).getValue() ;
64 Number r1=(Number)((Cell)tb.getValueAtIndex(vx,vy[1])).getValue() ;
65 float md=(r0.floatValue() +r1.floatValue() )/2;
66 result=new Float(md);
67 }
68 }
69 else{
70
71 assert false :"Can't handle";
72
73 }
74 return result;
75
76 }
77 /***
78 * si,ei : start index, end index
79 * return int[] median index
80 */
81 private int[] getMedianIndex(int si,int ei) {
82 int index[]=new int[2];
83 int nCells=Math.abs(si-ei)+1;
84 int middle=0;
85 if (nCells%2==0){//even number
86 middle=(si+ei)/2;
87 index[0]=middle;
88 index[1]=middle+1;
89
90 }
91 else{//odd
92 middle=(si+ei)/2;
93 index[0]=middle;
94 index[1]=-1;//means no index available
95 }
96 return index;
97
98 }
99 public String getUsage() {
100 return "MEDIAN(cell1:cell2)";
101 }
102
103 public String getDescription() {
104 return "Caculate a median value for a given row/column range.";
105 }
106 }
This page was automatically generated by Maven