0

Bean のリストがあり、そのリストに「VALUEA」と「VALUEB」を返すゲッターを持つ少なくとも 2 つの Bean があるかどうかを確認しています。これは、"VALUEC TOTAL" と呼ばれる 2 つの "total" Bean を構築できるようにするためです。最後に「総計」豆列も作っています。

ここでの問題は、「VALUEC TOTAL」だけです。最後にそれを行う方法ではなく、元のリストの「VALUEB」の後にそのBeanをリストに追加する必要があります。

概要が空でないことを確認できます。

summary = new ArrayList<WorkoutPlanBean>();
beans = dao.getAppropriationSummaryBySor(criteria, summary);

//Here we are setting up lists to be used to be added to the bottom of "Rollup" as "Totals" 
List<WorkoutPlanBean> valuecList = new ArrayList<WorkoutPlanBean>();
List<WorkoutPlanBean> sumList = new ArrayList<WorkoutPlanBean>();
for (WorkoutPlanBean b: summary)
{
    //We need 2 beans...one with VALUEA and one with VALUEB
    if( b.getSor().getShortName().equals("VALUEA") || b.getSor().getShortName().equals("VALUEB"))
    {
        valuecList.add(b);
    }
    sumList.add(b);
}
// Create VALUEC totals bean.
if (valuecList.size() > 1 )
{
    WorkoutPlanBean valuecTotals = new WorkoutPlanBean();
    valuecTotals.setSor(VALUEC_TOTALS_SOR);

    for (WorkoutPlanBean bean : valuecList)
    {
        valuecTotals.setQuantity(Overview.totalsIntegerAdd(valuecTotals.getQuantity(),
                                 bean.getQuantity()));

        valuecTotals.setHours(Overview.totalsDoubleAdd(valuecTotals.getHours(),
                              bean.getHours()));

        valuecTotals.setValue(Overview.totalsBigDecimalAdd(valuecTotals.getValue(),
                              bean.getValue()));
     }
     summary.add(valuecTotals); 
 }

 // Create Totals bean.
 if (sumList.size() > 1 )
 {
     WorkoutPlanBean globalTotals = new WorkoutPlanBean();
     globalTotals.setSor(GRAND_TOTALS_SOR);

     for (WorkoutPlanBean bean : sumList)
     {
         globalTotals.setQuantity(Overview.totalsIntegerAdd(globalTotals.getQuantity(),
                                  bean.getQuantity()));
         globalTotals.setHours(Overview.totalsDoubleAdd(globalTotals.getHours(),
                               bean.getHours()));
         globalTotals.setValue(Overview.totalsBigDecimalAdd(globalTotals.getValue(),
                               bean.getValue()));
     }
     summary.add(globalTotals); 
 }

 request.setAttribute("summary", summary);
4

2 に答える 2

2

必要なインデックスを取得して使用する必要があります。 list.add(index, yourBean)

于 2013-02-25T15:39:28.110 に答える
1

for-eachループではなく、インデックスを使用してリストを反復処理できます。

for(int i = 0; i < summary.size(); i++){
    WorkoutPlanBean b = summary.get(i);
    ...
}

したがって、最後のVALUEA / VALUEBのインデックスを覚えてから、summary.add(index、element)の合計を...

とにかく、ArrayListJavadocを見てください。

そしてところで、valuecListとsumListを必要とせずに、この最初のループ中に両方の合計を計算することもできます...

これはコードを編集するだけの例なので、タイプミスを修正する必要があるかもしれません。

summary = new ArrayList<WorkoutPlanBean>();
    beans = dao.getAppropriationSummaryBySor(criteria, summary);

    WorkoutPlanBean valuecTotals = new WorkoutPlanBean();
    valuecTotals.setSor(VALUEC_TOTALS_SOR);

    WorkoutPlanBean globalTotals = new WorkoutPlanBean();
    globalTotals.setSor(GRAND_TOTALS_SOR);

    int nbMdmc = 0; // to count VALUEA & VALUEB to know if a total is needed
    int lastMdmcIndex = 0;

    for (int i=0; i< summary.size(); i++)
    {
        WorkoutPlanBean bean = summary.get(i);

        //We need 2 beans...one with VALUEA and one with VALUEB
        if( bean.getSor().getShortName().equals("VALUEA") || bean.getSor().getShortName().equals("VALUEB"))
        {
            lastMdmcIndex = i;
            // count VALUEA and VALUEB
            nbMdmc++;

            // add to valuec total
            valuecTotals.setQuantity(Overview.totalsIntegerAdd(valuecTotals.getQuantity(),
                                                               bean.getQuantity()));
            valuecTotals.setHours(Overview.totalsDoubleAdd(valuecTotals.getHours(),
                                                                bean.getHours()));
            valuecTotals.setValue(Overview.totalsBigDecimalAdd(valuecTotals.getValue(),
                                                                bean.getValue()));
        }

        // add to grand total
        globalTotals.setQuantity(Overview.totalsIntegerAdd(globalTotals.getQuantity(),
                                                               bean.getQuantity()));
        globalTotals.setHours(Overview.totalsDoubleAdd(globalTotals.getHours(),
                                                                bean.getHours()));
        globalTotals.setValue(Overview.totalsBigDecimalAdd(globalTotals.getValue(),
                                                                bean.getValue()));

    }

    if(nbMdmc > 1) summary.add(lastMdmcIndex+1, valuecTotals); 

    if(summary.size() > 1) summary.add(globalTotals); 


request.setAttribute("summary", summary);
于 2013-02-25T15:48:05.857 に答える