View Javadoc
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