我遇到了一个令我难过的问题。我基本上有一系列商家,每个商家都有一个包含付款的数组。
付款是一个包含付款信息的简单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
,因为它仅插入星期一的第一个元素。
非常感谢能够突出对当前实施的新解释的任何帮助。
答案 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 );
}
希望这有帮助!