2016-04-11 16 views
-1

Ich habe eine ArrayList namens Items.Finden Sie ein Objekt in ArrayList und entfernen Sie es

Ich möchte die ArrayList durchlaufen und nach Namen, Preise suchen. Wenn der Name & Preis mit der Eingabe vom Benutzer übereinstimmt und der Preis höher als vorher ist, möchte ich das alte Objekt (mit Name und Preis) entfernen und dann das neue Element (aus der Eingabe) zur ArrayList hinzufügen.

Grundsätzlich wenn meine Arraylist enthalten sind: (Milch, 15)

Und Eingang unter Milch war, 19

Die neue Arraylist würde jetzt enthalten: (Milch, 19)

bearbeiten von Kommentare: Wie kann ich tun das ausgewählte Objekt deklarieren und entfernen?

System.out.println("Item name: "); 

String name = input.nextLine(); 

System.out.println("Price: "); 

int price = input.nextInt(); 

Item newItem = (Name, price); 



for (Items i: itemList) { 

    if(i.getName().contains(name) && i.getPrice()==price)) { 


     // here declare object which contains name & price 

     //Not sure if below would work but something along these lines 

     if(price > object.getPrice()) { 

      itemList.remove(object above) 

      //and then 

      itemList.add(newItem) 
     } 
    } 
} 
+0

Nun, haben Sie versucht, Ihren Code auszuführen? – OldProgrammer

+0

Es klingt, als ob Sie eine 'Map ', nicht eine 'ArrayList' benötigen. –

+0

@OldProgrammer ja, aber ich brauche Hilfe, das ausgewählte Objekt zu deklarieren und dann zu entfernen. – Ilja

Antwort

1

Sie können ein ArrayList NICHT ändern, während Sie es durchlaufen. Sie müssen sich merken, welches Element entfernt werden soll, und es nach dem Iterieren entfernen.

List<Item> itemToRemove = new LinkedList<Item>(); 

for (Items i: itemList) { 

    if(i.getName().contains(name) && i.getPrice() == price)) { 

     itemToRemove.add(i); 
    } 
} 

itemList.removeAll(itemToRemove); 
+0

Danke, tolle Lösung! – Ilja

2

Eine recht nette Art und Weise, dies zu tun ist, um die removeIf Methode zu verwenden und dann das neue Element hinzufügen, wenn etwas entfernt wird. removeIf kehrt true wenn etwas entfernt:

if(items.removeIf(item -> item.getName().equals(name) && item.getPrice() > price)) 
    items.add(new Item(name, price)); 

Hinweis: Dieser Code erfordert Java 8

+0

Lambdas. Gute Wahl – Logan

0

Ich würde sagen, dass Sie eine Map<String, Integer> stattdessen verwenden sollten. Eine Karte/Wörterbuch/etc ist etwas, das Schlüssel/Wert-Paare speichert, ist es für genau diese Art der Sache gemeint ist:

Map<String, Integer> values = new HashMap<>(); 

//example logic of utilizing the map to replace values and store the highest 
public int addBet(String name, int amount) { 
    //in Java 7 or less: 
    Integer old = values.get(name); //get the old value 
    if (old == null) { 
     old = amount; //if there was no old value, we'll use the new one 
    } else { 
     old = Math.max(old, amount); //if there was a value, use the highest 
    } 
    return values.put(name, old); //set the amount 
    //In Java 8, we have #compute for this instead: 
    return values.compute(name, old -> old == null ? amount : Math.max(old, amount)); 
} 

Also, das verwendet wird, könnten wir den höchsten Wert über #addBet sehen, die die Karte Nutzung demonstriert :

addBet("Bob", 10); //returns 10 
addBet("Foo", 14); //14 
addBet("Bob", 22); //22 
addBet("Bob", 15); //22 
values.get("Bob"); //22 
values.get("Foo"); //14 

Darüber hinaus ist dies viel effizienter als das Iterieren einer gesamten Liste jedes Mal.

Verwandte Themen