2016-08-05 96 views
-2

Es gibt eine Hashmap (o), die String als Schlüssel und Order Object als Wert verwendet. Bestellung hat eine Arraylist von OrderLines. Hier muss ich der Karte mehrere Befehle hinzufügen. Das Problem ist, dass meine hashmap eindeutige erste und zweite Schlüssel (Auftrag 1 und Auftrag 2) ausgibt, aber der zuletzt eingefügte Wert als Wert für beide Schlüssel (doppelte Reihenfolge in allen Einträgen). Können Sie mir bitte helfen, das Problem zu beheben?Doppelte Werteinfügung in Hashmap

Hauptklasse:

Map<String, Order> o = new HashMap<String, Order>(); 

    Order c = new Order(); 

    c.add(new OrderLine(new Item("book", (float) 12.49), 1)); 
    c.add(new OrderLine(new Item("music CD", (float) 14.99), 1)); 

    o.put("Order 1", c); 

    // Reuse cart for an other order 
    c.clearCart(); // this.orderLines.clear() in the order class 

    c.add(new OrderLine(new Item("imported box of chocolate", 10), 1)); 
    c.add(new OrderLine(new Item("imported bottle of perfume", (float)  47.50), 1)); 

    o.put("Order 2", c); 

    for (Map.Entry<String, Order> entry : o.entrySet()) { 
     System.out.println("*******" + entry.getKey() + entry.getValue().get(0).getItem().getDescription() + "*******"); 
    } 

Order-Klasse:

class Order { 

private List<OrderLine> orderLines = new ArrayList<>(); 

public void add(OrderLine o) throws Exception { 
    orderLines.add(o); 
} 

public OrderLine get(int i) { 
    return orderLines.get(i); 
} 

public void clearCart() { 
    this.orderLines.clear(); 
} 
} 

Orderline-Klasse:

private int quantity; 
private Item item; 

public OrderLine(Item item, int quantity) throws Exception { 
    if (item == null) { 
     System.err.println("ERROR - Item is NULL"); 
     throw new Exception("Item is NULL"); 
    } 
    assert quantity > 0; 
    this.item = item; 
    this.quantity = quantity; 
} 

public Item getItem() { 
    return item; 
} 

public int getQuantity() { 
    return quantity; 
} 
} 

Item-Klasse:

class Item { 

    private String description; 
    private float price; 

    public Item(String description, float price) { 
     super(); 
     this.description = description; 
     this.price = price; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public float getPrice() { 
     return price; 
    } 
    } 
+0

wo ist OrderLine-Klasse. So funktioniert dein Code. Veröffentlichen Sie den gesamten Code, ich werde vorschlagen, zu beheben. Sieht aus wie c.clearCart() ist nicht in der Lage, Warenkorb zu löschen – JavaHopper

+0

Hinzugefügt den ganzen Code –

+0

Wie bekommen Sie 'entry.getValue(). Get (0)' bei der SOP in der for-Schleife in der Hauptklasse? –

Antwort

2

Während Java-Pass-by-Wert ist, ist es durchaus möglich, zu ändern, was am Ende einer Referenz ist. Dies ist, was Sie tun, wenn auch unbeabsichtigt.

Denken Sie darüber nach, was Sie tun: Sie fügen c der Liste hinzu, löschen dann c,, initialisieren sie erneut und fügen sie erneut hinzu.

Wie Sie nie das new Schlüsselwort verwenden, sind Sie nie wirklich einen neuen Teil des Speichers für c. Zuweisung Es ist immer noch auf dem gleichen Order. Gleichzeitig zeigen wird, haben Sie nicht einen Klon von c zur Liste hinzuzufügen. Sie hinzugefügt c.

Mit anderen Worten, wenn Sie anrufen c.clearCart(), Sie auch die erste Order in Liste Clearing o als die Order ist c.

Sie entweder die new Schlüsselwort durch Ersetzen verwenden:

c.clearCart(); 

mit

c = new Order(); 

Oder Sie einen Klon von c hinzufügen könnten o statt c selbst, zur Liste so, dass, wenn Sie anrufen c.clearCart(), Sie sind nicht das erste Element in der Liste o. Mit anderen Worten löschen, ersetzen:

o.put("Order 1", c); 

mit

o.put("Order 1", c.clone()); 

Weitere Informationen finden Sie unter this question.

EDIT:

Ich habe vergessen, ein Teil, obwohl es offensichtlich sein kann.Ich stellte fest, dass c Clearing wird auch in der Liste o, das erste Element löschen, weil das Element ist c. Allerdings habe ich vergessen zu erwähnen, dass, durch den Übergang, Neuinitialisierung c bedeutet auch gleichzeitig dieses Element erneut initialisiert wird. Wenn Sie also erneut c hinzufügen, haben Sie zwei Elemente mit den gleichen Feldern initialisiert.