001 package jp.osdl.jbento2.analyzer; 002 003 import java.math.BigDecimal; 004 import java.math.BigInteger; 005 import java.util.ArrayList; 006 import java.util.Collections; 007 import java.util.Iterator; 008 009 public class Stats { 010 011 private ArrayList values = new ArrayList(); 012 013 public void add(long l) { 014 values.add(new Long(l)); 015 } 016 017 public int count() { 018 return values.size(); 019 } 020 021 public BigInteger total() { 022 BigInteger result = new BigInteger("0"); 023 for (Iterator it = values.iterator(); it.hasNext(); ) { 024 result = result.add(new BigInteger(String.valueOf(it.next()))); 025 } 026 return result; 027 } 028 029 public long min() { 030 ArrayList clone = (ArrayList)values.clone(); 031 Collections.sort(clone); 032 Long result = (Long)clone.get(0); 033 return result.longValue(); 034 } 035 036 public long max() { 037 ArrayList clone = (ArrayList)values.clone(); 038 Collections.sort(clone); 039 Long result = (Long)clone.get(clone.size() - 1); 040 return result.longValue(); 041 } 042 043 public double average() { 044 if (count() == 0) { 045 return 0.0d; 046 } 047 return 048 new BigDecimal(total()).divide( 049 new BigDecimal(count()), 3, BigDecimal.ROUND_HALF_UP 050 ).doubleValue(); 051 } 052 053 public long percentile(int percent) { 054 ArrayList clone = (ArrayList)values.clone(); 055 Collections.sort(clone); 056 Long result = (Long)clone.get(count() * percent / 100); 057 return result.longValue(); 058 } 059 060 public double variance() { 061 double average = average(); 062 double total = 0; 063 for (Iterator it = values.iterator(); it.hasNext(); ) { 064 total += Math.pow(((Long)it.next()).longValue() - average, 2); 065 } 066 return total / count(); 067 } 068 069 public double sd() { 070 return Math.sqrt(variance()); 071 } 072 073 }