由于先前未预先设置值,嵌套循环不计算正确的数量

时间:2018-02-03 18:45:54

标签: java loops recursion

我遇到了一个令我难过的问题。我基本上有一系列商家,每个商家都有一个包含付款的数组。

付款是一个包含付款信息的简单POJO,开发循环以从商家检索每个付款,计算当天的总金额并将其存储在新的列表中。下面的代码是有问题的代码

private void calculateMerchantTotals()
{
    double dayAmount = 0;
    DayOfWeek previousDay = null;

    for( Merchant merchant : merchantList )
    {
        for( Payment payment : merchant.getPayments() )
        {
            if( payment.getPaymentDue().get(ChronoField.CLOCK_HOUR_OF_DAY) >= 16 && payment.getPaymentDue().get(ChronoField.CLOCK_HOUR_OF_DAY) != 24 )
            {
                payment.setPaymentDue( payment.getPaymentDue().plusDays(1) );
            }

            dayAmount += payment.getAmount();

            if( !payment.getPaymentDue().getDayOfWeek().equals( previousDay ) )
            {
                dayAmount = Math.round(dayAmount * 100.0) / 100.0;
                tableDataList.add( new TableData( payment.getPaymentDue().getDayOfWeek(), merchant.getMerchantName(), dayAmount ) );
                dayAmount = 0;
            }

            previousDay = payment.getPaymentDue().getDayOfWeek();
        }
    }

    System.out.println( tableDataList );
}

变量previousDay用于存储当前日期,并继续迭代当天的总数。当发现新的一天时,应将当前金额与日期和商家名称一起添加到列表中,并应再次继续循环。虽然情况并非如此,但在第一次迭代期间,previousDay变量为null并声明True导致第一个元素插入到List中,尽管显然在第一个元素之后下一个元素被正确计算和存储。

当前输出:

TableData: 
Day: MONDAY
Name: Sky
Amount: 64.4, 
TableData: 
Day: TUESDAY
Name: Sky
Amount: 185031.75, 
TableData: 
Day: WEDNESDAY
Name: Sky
Amount: 273188.4 ... (continued)

TableData: Monday应为280105.19,但仅为64.4,因为它仅插入星期一的第一个元素。

非常感谢能够突出对当前实施的新解释的任何帮助。

1 个答案:

答案 0 :(得分:1)

好吧,您可以添加此条件以捕获第二个条件之前的第一个元素(检查新的日期):

if(previousDay == null)
   previousDay = payment.getPaymentDue().getDayOfWeek();

当您添加到列表时,请使用previousDay,而不是当前日期,因为收集的总值是前几天。您还需要以前的商家名称。 希望这应该有效。这是我添加后的代码:

private void calculateMerchantTotals()
{
    double dayAmount = 0;
    DayOfWeek previousDay = null;
    String previousName = "";

    for( Merchant merchant : merchantList )
    {
        for( Payment payment : merchant.getPayments() )
        {
            if( payment.getPaymentDue().get(ChronoField.CLOCK_HOUR_OF_DAY) >= 16 && payment.getPaymentDue().get(ChronoField.CLOCK_HOUR_OF_DAY) != 24 )
            {
                payment.setPaymentDue( payment.getPaymentDue().plusDays(1) );
            }

            dayAmount += payment.getAmount();

            // The newly injected condition here
            if(previousDay == null)
               previousDay = payment.getPaymentDue().getDayOfWeek();

            if( !payment.getPaymentDue().getDayOfWeek().equals( previousDay ) )
            {
                dayAmount = Math.round(dayAmount * 100.0) / 100.0;
                tableDataList.add( new TableData( previousDay, previousName, dayAmount ) );
                dayAmount = 0;
            }

            previousDay = payment.getPaymentDue().getDayOfWeek();
            previousName = merchant.getMerchantName();
        }
    }
    // For adding the last day into the list
    tableDataList.add( new TableData( previousDay, previousName, dayAmount ) );

    System.out.println( tableDataList );
}

希望这有帮助!