开发者

How to add a collections of class's into a class that has collection

I have an ArrayList of Products, that i want to add to My map of sales class in my Product class. The purpose of this is to have each product record what was bought with it and how much.

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()));
        }
    }



}

The Results I am getting are :

 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)

i should be getting :

   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)

Any hints or clues on how i can stop it from over counting ?


update : Tried Péter Török Suggestion, Got this result:

 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, p开发者_如何学Goears 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)


I think the root of the problem is that for every pair of products with the index (i,j), you process them twice in your loop: once as (i,j), then as (j,i). Try with this loop instead:

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));
        }
    }
}

(here the inner loop counter starts from i + 1 instead of 0. Note also that I modified both loop conditions because I think your original loops have an off by one error - the last element in the array has the index array.size() - 1.)

Update

And there is also a copy-paste bug here:

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

whereas it should be

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜