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