149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera/* 249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. 349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * This code is free software; you can redistribute it and/or modify it 649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * under the terms of the GNU General Public License version 2 only, as 749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * published by the Free Software Foundation. Oracle designates this 849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * particular file as subject to the "Classpath" exception as provided 949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * by Oracle in the LICENSE file that accompanied this code. 1049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 1149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * This code is distributed in the hope that it will be useful, but WITHOUT 1249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * version 2 for more details (a copy is included in the LICENSE file that 1549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * accompanied this code). 1649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 1749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * You should have received a copy of the GNU General Public License version 1849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 2 along with this work; if not, write to the Free Software Foundation, 1949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 2149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * or visit www.oracle.com if you need additional information or have any 2349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * questions. 2449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera */ 2549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmerapackage java.util; 2649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera 2749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmeraimport java.util.function.DoubleConsumer; 2849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera 2949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera/** 3049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * A state object for collecting statistics such as count, min, max, sum, and 3149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * average. 3249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 3349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * <p>This class is designed to work with (though does not require) 34a2f3a30b4256145b4317bf4b14f6d838906d8c8fShubham Ajmera * {@linkplain java.util.stream streams}. For example, you can compute 3549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * summary statistics on a stream of doubles with: 3649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * <pre> {@code 3749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * DoubleSummaryStatistics stats = doubleStream.collect(DoubleSummaryStatistics::new, 3849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * DoubleSummaryStatistics::accept, 3949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * DoubleSummaryStatistics::combine); 4049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * }</pre> 4149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 4249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * <p>{@code DoubleSummaryStatistics} can be used as a 43a2f3a30b4256145b4317bf4b14f6d838906d8c8fShubham Ajmera * {@linkplain java.util.stream.Stream#collect(Collector) reduction} 44a2f3a30b4256145b4317bf4b14f6d838906d8c8fShubham Ajmera * target for a {@linkplain java.util.stream.Stream stream}. For example: 4549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 4649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * <pre> {@code 4749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * DoubleSummaryStatistics stats = people.stream() 4849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * .collect(Collectors.summarizingDouble(Person::getWeight)); 4949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera *}</pre> 5049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 5149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * This computes, in a single pass, the count of people, as well as the minimum, 5249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * maximum, sum, and average of their weights. 5349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 5449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * @implNote This implementation is not thread safe. However, it is safe to use 55a2f3a30b4256145b4317bf4b14f6d838906d8c8fShubham Ajmera * {@link java.util.stream.Collectors#summarizingDouble(java.util.function.ToDoubleFunction) 5649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * Collectors.toDoubleStatistics()} on a parallel stream, because the parallel 57a2f3a30b4256145b4317bf4b14f6d838906d8c8fShubham Ajmera * implementation of {@link java.util.stream.Stream#collect Stream.collect()} 5849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * provides the necessary partitioning, isolation, and merging of results for 5949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * safe and efficient parallel execution. 6049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * @since 1.8 6149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera */ 6249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmerapublic class DoubleSummaryStatistics implements DoubleConsumer { 6349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera private long count; 6449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera private double sum; 6549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera private double sumCompensation; // Low order bits of sum 6649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera private double simpleSum; // Used to compute right sum for non-finite inputs 6749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera private double min = Double.POSITIVE_INFINITY; 6849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera private double max = Double.NEGATIVE_INFINITY; 6949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera 7049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera /** 7149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * Construct an empty instance with zero count, zero sum, 7249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * {@code Double.POSITIVE_INFINITY} min, {@code Double.NEGATIVE_INFINITY} 7349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * max and zero average. 7449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera */ 7549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera public DoubleSummaryStatistics() { } 7649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera 7749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera /** 7849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * Records another value into the summary information. 7949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 8049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * @param value the input value 8149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera */ 8249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera @Override 8349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera public void accept(double value) { 8449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera ++count; 8549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera simpleSum += value; 8649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera sumWithCompensation(value); 8749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera min = Math.min(min, value); 8849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera max = Math.max(max, value); 8949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera } 9049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera 9149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera /** 9249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * Combines the state of another {@code DoubleSummaryStatistics} into this 9349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * one. 9449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 9549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * @param other another {@code DoubleSummaryStatistics} 9649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * @throws NullPointerException if {@code other} is null 9749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera */ 9849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera public void combine(DoubleSummaryStatistics other) { 9949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera count += other.count; 10049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera simpleSum += other.simpleSum; 10149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera sumWithCompensation(other.sum); 10249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera sumWithCompensation(other.sumCompensation); 10349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera min = Math.min(min, other.min); 10449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera max = Math.max(max, other.max); 10549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera } 10649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera 10749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera /** 10849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * Incorporate a new double value using Kahan summation / 10949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * compensated summation. 11049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera */ 11149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera private void sumWithCompensation(double value) { 11249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera double tmp = value - sumCompensation; 11349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera double velvel = sum + tmp; // Little wolf of rounding error 11449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera sumCompensation = (velvel - sum) - tmp; 11549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera sum = velvel; 11649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera } 11749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera 11849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera /** 11949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * Return the count of values recorded. 12049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 12149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * @return the count of values 12249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera */ 12349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera public final long getCount() { 12449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera return count; 12549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera } 12649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera 12749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera /** 12849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * Returns the sum of values recorded, or zero if no values have been 12949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * recorded. 13049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 13149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * If any recorded value is a NaN or the sum is at any point a NaN 13249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * then the sum will be NaN. 13349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 13449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * <p> The value of a floating-point sum is a function both of the 13549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * input values as well as the order of addition operations. The 13649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * order of addition operations of this method is intentionally 13749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * not defined to allow for implementation flexibility to improve 13849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * the speed and accuracy of the computed result. 13949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 14049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * In particular, this method may be implemented using compensated 14149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * summation or other technique to reduce the error bound in the 14249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * numerical sum compared to a simple summation of {@code double} 14349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * values. 14449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 14549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * @apiNote Values sorted by increasing absolute magnitude tend to yield 14649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * more accurate results. 14749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 14849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * @return the sum of values, or zero if none 14949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera */ 15049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera public final double getSum() { 15149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera // Better error bounds to add both terms as the final sum 15249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera double tmp = sum + sumCompensation; 15349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera if (Double.isNaN(tmp) && Double.isInfinite(simpleSum)) 15449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera // If the compensated sum is spuriously NaN from 15549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera // accumulating one or more same-signed infinite values, 15649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera // return the correctly-signed infinity stored in 15749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera // simpleSum. 15849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera return simpleSum; 15949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera else 16049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera return tmp; 16149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera } 16249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera 16349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera /** 16449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * Returns the minimum recorded value, {@code Double.NaN} if any recorded 16549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * value was NaN or {@code Double.POSITIVE_INFINITY} if no values were 16649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * recorded. Unlike the numerical comparison operators, this method 16749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * considers negative zero to be strictly smaller than positive zero. 16849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 16949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * @return the minimum recorded value, {@code Double.NaN} if any recorded 17049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * value was NaN or {@code Double.POSITIVE_INFINITY} if no values were 17149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * recorded 17249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera */ 17349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera public final double getMin() { 17449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera return min; 17549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera } 17649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera 17749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera /** 17849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * Returns the maximum recorded value, {@code Double.NaN} if any recorded 17949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * value was NaN or {@code Double.NEGATIVE_INFINITY} if no values were 18049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * recorded. Unlike the numerical comparison operators, this method 18149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * considers negative zero to be strictly smaller than positive zero. 18249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 18349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * @return the maximum recorded value, {@code Double.NaN} if any recorded 18449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * value was NaN or {@code Double.NEGATIVE_INFINITY} if no values were 18549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * recorded 18649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera */ 18749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera public final double getMax() { 18849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera return max; 18949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera } 19049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera 19149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera /** 19249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * Returns the arithmetic mean of values recorded, or zero if no 19349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * values have been recorded. 19449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 19549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * If any recorded value is a NaN or the sum is at any point a NaN 19649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * then the average will be code NaN. 19749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 19849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * <p>The average returned can vary depending upon the order in 19949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * which values are recorded. 20049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 20149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * This method may be implemented using compensated summation or 20249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * other technique to reduce the error bound in the {@link #getSum 20349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * numerical sum} used to compute the average. 20449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 20549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * @apiNote Values sorted by increasing absolute magnitude tend to yield 20649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * more accurate results. 20749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 20849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * @return the arithmetic mean of values, or zero if none 20949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera */ 21049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera public final double getAverage() { 21149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera return getCount() > 0 ? getSum() / getCount() : 0.0d; 21249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera } 21349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera 21449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera /** 21549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * {@inheritDoc} 21649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * 21749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * Returns a non-empty string representation of this object suitable for 21849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * debugging. The exact presentation format is unspecified and may vary 21949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera * between implementations and versions. 22049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera */ 22149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera @Override 22249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera public String toString() { 22349b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera return String.format( 22449b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera "%s{count=%d, sum=%f, min=%f, average=%f, max=%f}", 22549b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera this.getClass().getSimpleName(), 22649b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera getCount(), 22749b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera getSum(), 22849b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera getMin(), 22949b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera getAverage(), 23049b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera getMax()); 23149b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera } 23249b5e20d6e5c17985c141fff49f135b05284b62dShubham Ajmera} 233