2016-04-11 3 views
-1

У меня есть ArrayList, называемый Items.Найти объект в ArrayList и удалить его

Я хочу пройти через ArrayList и искать имена, цены. Если имя & соответствует совпадению с данными пользователя, а цена выше, чем раньше, я хочу удалить старый объект (содержащий имя и цену, затем добавить новый элемент (от ввода) в ArrayList.

В основном если мой ArrayList содержал: (Milk, 15)

И вход ниже был Milk, 19

новый ArrayList теперь будет содержать: (Milk, 19)

Редактировать из Комментарии: Как я объявить выбранный объект и удалить его?

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

Ну, вы пробовали использовать код? – OldProgrammer

+0

Похоже, вам нужна 'Map ', а не 'ArrayList'. –

+0

@OldProgrammer да, но мне нужна помощь, объявляя выделенный объект, а затем удаляя его. – Ilja

ответ

1

Вы НЕ МОЖЕТЕ модифицировать ArrayList при повторении через него. Вы должны помнить, какой элемент удалить и удалить после повтора.

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

Спасибо, отличное решение! – Ilja

2

Один достаточно аккуратный способ сделать это состоит в использовании метода removeIf, а затем добавить новый элемент, если что-нибудь будет удален. removeIf возвращает true если что-то удаляется:

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

Примечание: этот код требует Java 8

+0

Lambdas. Хороший выбор – Logan

0

Я бы сказал, что вы должны использовать Map<String, Integer> вместо этого. Карта/Словарь/и т.д. является то, что хранит пары ключ/значение, это означает именно для такого рода вещи:

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

Таким образом, используя это, мы могли бы увидеть наибольшее значение через #addBet, который демонстрирует использование карты :

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 

Кроме того, это намного эффективнее, чем повторение всего списка каждый раз.

Смежные вопросы