📄 statistics.java
字号:
/* ===========================================================
* JFreeChart : a free chart library for the Java(tm) platform
* ===========================================================
*
* (C) Copyright 2000-2006, by Object Refinery Limited and Contributors.
*
* Project Info: http://www.jfree.org/jfreechart/index.html
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
* [Java is a trademark or registered trademark of Sun Microsystems, Inc.
* in the United States and other countries.]
*
* ---------------
* Statistics.java
* ---------------
* (C) Copyright 2000-2006, by Matthew Wright and Contributors.
*
* Original Author: Matthew Wright;
* Contributor(s): David Gilbert (for Object Refinery Limited);
*
* $Id: Statistics.java,v 1.5.2.2 2006/11/16 11:19:47 mungady Exp $
*
* Changes (from 08-Nov-2001)
* --------------------------
* 08-Nov-2001 : Added standard header and tidied Javadoc comments (DG);
* Moved from JFreeChart to package com.jrefinery.data.* in
* JCommon class library (DG);
* 24-Jun-2002 : Removed unnecessary local variable (DG);
* 07-Oct-2002 : Fixed errors reported by Checkstyle (DG);
* 26-May-2004 : Moved calculateMean() method from BoxAndWhiskerCalculator (DG);
* 02-Jun-2004 : Fixed bug in calculateMedian() method (DG);
* 11-Jan-2005 : Removed deprecated code in preparation for the 1.0.0
* release (DG);
*
*/
package org.jfree.data.statistics;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/**
* A utility class that provides some common statistical functions.
*/
public abstract class Statistics {
/**
* Returns the mean of an array of numbers. This is equivalent to calling
* <code>calculateMean(values, true)</code>.
*
* @param values the values (<code>null</code> not permitted).
*
* @return The mean.
*/
public static double calculateMean(Number[] values) {
return calculateMean(values, true);
}
/**
* Returns the mean of an array of numbers.
*
* @param values the values (<code>null</code> not permitted).
* @param includeNullAndNaN a flag that controls whether or not
* <code>null</code> and <code>Double.NaN</code> values are included
* in the calculation (if either is present in the array, the result is
* {@link Double#NaN}).
*
* @return The mean.
*
* @since 1.0.3
*/
public static double calculateMean(Number[] values,
boolean includeNullAndNaN) {
if (values == null) {
throw new IllegalArgumentException("Null 'values' argument.");
}
double sum = 0.0;
double current;
int counter = 0;
for (int i = 0; i < values.length; i++) {
// treat nulls the same as NaNs
if (values[i] != null) {
current = values[i].doubleValue();
}
else {
current = Double.NaN;
}
// calculate the sum and count
if (includeNullAndNaN || !Double.isNaN(current)) {
sum = sum + current;
counter++;
}
}
double result = (sum / counter);
return result;
}
/**
* Returns the mean of a collection of <code>Number</code> objects.
*
* @param values the values (<code>null</code> not permitted).
*
* @return The mean.
*/
public static double calculateMean(Collection values) {
return calculateMean(values, true);
}
/**
* Returns the mean of a collection of <code>Number</code> objects.
*
* @param values the values (<code>null</code> not permitted).
* @param includeNullAndNaN a flag that controls whether or not
* <code>null</code> and <code>Double.NaN</code> values are included
* in the calculation (if either is present in the array, the result is
* {@link Double#NaN}).
*
* @return The mean.
*
* @since 1.0.3
*/
public static double calculateMean(Collection values,
boolean includeNullAndNaN) {
if (values == null) {
throw new IllegalArgumentException("Null 'values' argument.");
}
int count = 0;
double total = 0.0;
Iterator iterator = values.iterator();
while (iterator.hasNext()) {
Object object = iterator.next();
if (object == null) {
if (includeNullAndNaN) {
return Double.NaN;
}
}
else {
if (object instanceof Number) {
Number number = (Number) object;
double value = number.doubleValue();
if (Double.isNaN(value)) {
if (includeNullAndNaN) {
return Double.NaN;
}
}
else {
total = total + number.doubleValue();
count = count + 1;
}
}
}
}
return total / count;
}
/**
* Calculates the median for a list of values (<code>Number</code> objects).
* The list of values will be copied, and the copy sorted, before
* calculating the median. To avoid this step (if your list of values
* is already sorted), use the {@link #calculateMedian(List, boolean)}
* method.
*
* @param values the values (<code>null</code> permitted).
*
* @return The median.
*/
public static double calculateMedian(List values) {
return calculateMedian(values, true);
}
/**
* Calculates the median for a list of values (<code>Number</code> objects).
* If <code>copyAndSort</code> is <code>false</code>, the list is assumed
* to be presorted in ascending order by value.
*
* @param values the values (<code>null</code> permitted).
* @param copyAndSort a flag that controls whether the list of values is
* copied and sorted.
*
* @return The median.
*/
public static double calculateMedian(List values, boolean copyAndSort) {
double result = Double.NaN;
if (values != null) {
if (copyAndSort) {
int itemCount = values.size();
List copy = new ArrayList(itemCount);
for (int i = 0; i < itemCount; i++) {
copy.add(i, values.get(i));
}
Collections.sort(copy);
values = copy;
}
int count = values.size();
if (count > 0) {
if (count % 2 == 1) {
if (count > 1) {
Number value = (Number) values.get((count - 1) / 2);
result = value.doubleValue();
}
else {
Number value = (Number) values.get(0);
result = value.doubleValue();
}
}
else {
Number value1 = (Number) values.get(count / 2 - 1);
Number value2 = (Number) values.get(count / 2);
result = (value1.doubleValue() + value2.doubleValue())
/ 2.0;
}
}
}
return result;
}
/**
* Calculates the median for a sublist within a list of values
* (<code>Number</code> objects).
*
* @param values the values, in any order (<code>null</code> not
* permitted).
* @param start the start index.
* @param end the end index.
*
* @return The median.
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -