如何将类的集合添加到具有集合的类中

时间:2011-05-23 16:03:01

标签: java collections merge arraylist maps

我有一个产品的ArrayList,我想在我的Product类中添加到我的销售类地图。这样做的目的是让每个产品记录用它购买的东西和多少。

ArrayList<Product> array = new ArrayList<Product>(tempProducts.values());
for (int i = 0; i < array.size() - 1; i++) {
            for (int j = i+1; j < array.size() ; j++) {
                update(array.get(i), array.get(j));
            }
        }
    }


 public static void update(Product a, Product b)
{



    if (a.getId().compareToIgnoreCase(b.getId()) != 0) {
        if (a.getCollection().get(b.getId()) != null) {
            a.getCollection().get(b.getId()).incsales();

        } else {

            a.getCollection().put(b.getId(), new sale(b.getId(), b.getDesc()));
        }
        if (b.getCollection().containsKey(a.getId())) {
            a.getCollection().get(b.getId()).incsales();

        } else {
            b.getCollection().put(a.getId(), new sale(a.getId(), a.getDesc()));
        }
    }



}

我得到的结果是:

 Description : Balsamic Ital Dressing 2.5L Kraft
 Sales : 80
 This product was purchased the most with :
 1 0000795501891 Babyfood, dinner, vegetables and lamb, junior (7)
 2 0000053838530 Cheese, cottage, creamed, large or small curd (7)
 3 0001580359521 Macadamia Nuts Kernels 1KG Natural Grocer (7)
 4 0001549470330 Orange Juice Long Life 2L Just Juice (7)
 5 0000102800862 Babyfood, fruit, pears and pineapple, junior (5)
 Description : Mighty Soft Bread Multigrain Sandwich 700g
 Sales : 78
 This product was purchased the most with :
 1 0000250315049 Babyfood, cereal, barley, prepared with whole milk (7)
 2 0001906925229 Coles Bread Multigrain Sliced 700g (7)
 3 0001348704022 Honey Portion 48X14G Beerenberg (7)
 4 0000965461817 Milk, canned, evaporated, nonfat, with added vitamin A and vitamin D (7)
  5 0000883156398 Abotts Village Bakery Wholemeal Farmhouse 750g (5)

我应该得到:

   Description : Balsamic Ital Dressing 2.5L Kraft 
  Sales : 80
  This product was purchased the most with :
  1 0000102800862 Babyfood, fruit, pears and pineapple, junior (4)
  2 0000449778467 Decaf Ground Coffee 250G Cremadoro (4)
  3 0001549470330 Orange Juice Long Life 2L Just Juice (4)
  4 0000795501891 Babyfood, dinner, vegetables and lamb, junior (3)
  5 0000708398761 Butter, salted (3)
  Description : Mighty Soft Bread Multigrain Sandwich 700g
  Sales : 78
  This product was purchased the most with :
  1 0000497527798 Cream Cheese Philadelphia Light 1KG Kraft (4)
  2 0000890198554 Mayonnaise Fat Free 2.7KG Kraft (4)
  3 0000298379350 Milk, buttermilk, dried (4)
  4 0000250315049 Babyfood, cereal, barley, prepared with whole milk (3)
  5 0000966839744 Babyfood, cereal, with egg yolks, strained (3)

关于如何阻止它过度计数的任何提示或线索?


更新: 尝试过PéterTörök建议,得到了这个结果:

 Description : Balsamic Ital Dressing 2.5L Kraft
    Sales : 80
    This product was purchased the most with :
    1 0001549470330 Orange Juice Long Life 2L Just Juice (7)
    2 0000102800862 Babyfood, fruit, pears and pineapple, junior (5)
    3 0000708398761 Butter, salted (5)
    4 0002140785264 Egg, whole, dried, stabilized, glucose reduced (5)
    5 0000422477496 Essence Parisian 575ML Aeroplane (5)
    Description : Mighty Soft Bread Multigrain Sandwich 700g
   Sales : 78
   This product was purchased the most with :
    1 0001906925229 Coles Bread Multigrain Sliced 700g (5)
    2 0000127034559 Limonata 24X200ML San Pellegrino (5)
    3 0001736609947 Babyfood, dessert, custard pudding, vanilla, junior (3)
    4 0002028785759 Babyfood, dinner, beef stew, toddler (3)
    5 0000432411254 Babyfood, juice, orange and pineapple (3)

1 个答案:

答案 0 :(得分:1)

我认为问题的根源在于对于具有索引(i,j)的每对产品,在循环中处理它们两次:一次为(i,j),然后为(j,i)。请尝试使用此循环:

for (int i = 0; i < array.size() - 1; i++) {
        for (int j = i + 1; j < array.size(); j++) {
            update(array.get(i), array.get(j));
        }
    }
}

(这里内部循环计数器从i + 1而不是0开始。请注意,我修改了两个循环条件,因为我认为你的原始循环有一个错误 - 最后一个元素数组的索引为array.size() - 1。)

更新

此处还有一个复制粘贴错误:

    if (b.getCollection().containsKey(a.getId())) {
        a.getCollection().get(b.getId()).incsales();

然而它应该是

        b.getCollection().get(a.getId()).incsales();