你如何计算 iReport 中变量的中位数?

How do you calculate the median for a variable in iReport?

我正在 iReport 中准备一份报告,我需要计算将在交叉表中使用的变量的字段中值。我注意到没有内置的中位数计算类型(只有最高和最低)。

有什么方法可以在 iReport 中获取字段的中位数或第 50 个百分位数?

JasperReports 中没有内置的中位数计算。

仍然可以通过手动收集列表中的值然后使用 Apache Commons Math 进行计算来获得中位数。

请看下面的例子。该报告还使用 Apache Commons Lang 将包装器数组转换为原始数组。要 运行 报告,您需要将 commons-math3-x.y.z.jar 和 commons-lang3-x.y.jar 添加到类路径中。

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="FirstJasper" columnCount="1" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="30" bottomMargin="30">
    <style name="Sans_Normal" isDefault="true" fontName="DejaVu Sans" fontSize="8"/>
    <queryString>SELECT * FROM Orders</queryString>
    <field name="Freight" class="java.lang.Double"/>
    <variable name="FreightList" class="java.util.List">
        <variableExpression>$V{FreightList}</variableExpression>
        <initialValueExpression>new java.util.ArrayList()</initialValueExpression>
    </variable>
    <variable name="AddFreight" class="java.lang.Boolean">
        <variableExpression>$V{FreightList}.add($F{Freight})</variableExpression>
    </variable>
    <title>
        <band height="50">
            <textField evaluationTime="Report">
                <reportElement x="5" y="5" width="350" height="40"/>
                <textFieldExpression><![CDATA["median is " + org.apache.commons.math3.stat.StatUtils.percentile(org.apache.commons.lang3.ArrayUtils.toPrimitive((Double[]) $V{FreightList}.toArray(new Double[$V{FreightList}.size()])), 50)]]></textFieldExpression>
            </textField>
        </band>
    </title>
    <detail>
        <band height="13">
            <textField pattern="0.00">
                <reportElement x="5" y="0" width="350" height="11"/>
                <textFieldExpression><![CDATA[$F{Freight}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>