Как удалить конкретный объект в ArrayList при использовании сканера в Java - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь удалить MemberPlayer (объект) из моего ArrayList (memberList) через мой ввод (сканер)

Я попытался просмотреть Google и Stack, но не могу найти ничего, что используетсканер.

    public void removeMember(){
    System.out.println("Which MemberPlayer are you looking for?:");
    System.out.print("Input first name: ");
    String fName = input.nextLine().toUpperCase();
    System.out.print("Input last name: ");
    String lName = input.nextLine().toUpperCase();

    for (MemberPlayer m: memberlist){
        if(m.getFirstName().contains(fName) && m.getLastName().contains(lName)) {
            System.out.println();
            System.out.println("This MemberPlayer exist:");
            System.out.println(fName + " " + lName);

            System.out.print("Do you want to remove this MemberPlayer?  [yes/no]");
            input.nextLine().toUpperCase();
            if (input.equals("Yes")) {
                memberlist.remove(); //I can't figure out how to write this line?
            }else{
                break;
            }
        }else {
            System.out.println();
            System.out.println("This MemberPlayer doesn't exist");
            System.out.println();
            break;
        }
    }
}

Я прочитал свой список участников из файла file.txt со следующей информацией: имя, фамилия, возраст и команда.

ANDERS
ANDERSEN 23 1

BERT BERSEN 16 2

HANS HANSEN 25 1

TIM TIMSEN 20 2
MORTEN MORTENSEN 34 1

Ответы [ 4 ]

0 голосов
/ 21 февраля 2019

это то, что сработало для меня после проб и ошибок.

public void removeMember()throws FileNotFoundException {
    System.out.println("Which MemberPlayer are you looking to remove?:");
    System.out.print("Input first name: ");
    String fName1 = input.nextLine().toUpperCase();
    System.out.print("Input last name: ");
    String lName2 = input.nextLine().toUpperCase();

    for (MemberPlayer m : memberlist){

        if (m.getFirstName().equals(fName1) & m.getLastName().equals(lName2)) {
            System.out.println();
            memberlist.remove(m);
            System.out.println("You removed: "+m.getFirstName()+" "+m.getLastName());
            System.out.println();
            saveMember();
            break;
        } else {
            System.out.println();
            System.out.println("This MemberPlayer doesn't exist");
            System.out.println();
            break;
        }
    }
}
0 голосов
/ 17 февраля 2019

Я рекомендую использовать Iterator для этого, так как List.remove(Object o) может выдать ConcurrentModificationException при изменении состояния объекта во время итерации.

Итак Iterator.remove() будет безопасной ставкой.Из документов Java SE 1.8 :

Итераторы позволяют вызывающей стороне удалять элементы из базовой коллекции во время итерации с четко определенной семантикой .

Таким образом, удаление объекта непосредственно из List с использованием List.remove() приведет к непредсказуемой итерации и вызовет ConcurrentModificationException во время итерации.

Если вы не итерируете тогда можно использовать List.remove(Object o) для удаления объекта из List.

//Initializes the iterator, checks if next element is present by calling Iterator.hasNext()
for(Iterator<MemberPlayer> itr = memberList.iterator(); itr.hasNext(); ){
         m = itr.next(); //The current element of the List
         if(m.getFirstName().contains(fName) && m.getLastName().contains(lName)) {
            System.out.println();
            System.out.println("This MemberPlayer exist:");
            System.out.println(fName + " " + lName);

            System.out.print("Do you want to remove this MemberPlayer?  [yes/no]");
            input.nextLine().toUpperCase();
            if (input.equals("Yes")) {
                 itr.remove(); //Removes the current element if the condition is satisfied.
            }else{
                 break;
            }
         }else {
             System.out.println();
             System.out.println("This MemberPlayer doesn't exist");
             System.out.println();
             break;
         }
 }
0 голосов
/ 17 февраля 2019

Помните, что вы не можете удалить элемент Collection<T>, пока выполняете его, используя цикл for-each.В этом случае может быть выброшено ConcurrentModificationException.

Вам необходимо явно использовать Interator<T> или ListIterator<T>, в зависимости от варианта использования.
A ListIterator позволяет также вставлять элементы илинастройка элементов.

for (final Iterator<MemberPlayer> iterator = memberList.iterator(); iterator.hasNext();) {
   final MemberPlayer m = iterator.next();

   if (m.getFirstName().contains(fName) && m.getLastName().contains(lName)) {
      ...

      iterator.remove();
   }
}
0 голосов
/ 17 февраля 2019

Вам необходимо использовать List # remove () , из документов:

логическое удаление (Object o)

Удаляет первое вхождение указанного элемента из этого списка, если он присутствует (необязательная операция).Если этот список не содержит элемент, он не изменяется.Более формально, удаляет элемент с наименьшим индексом i таким образом, что (o == null? Get (i) == null: o.equals (get (i))) (если такой элемент существует).Возвращает true, если этот список содержал указанный элемент (или эквивалентно, если этот список изменился в результате вызова).


Кроме того, здесь вам не нужен for-loop.Ваш метод может быть упрощен до гораздо более подходящего ОО:

public void removeMember() {
    System.out.println("Which MemberPlayer are you looking for?:");
    System.out.print("Input first name: ");
    String fName = input.nextLine().toUpperCase();
    System.out.print("Input last name: ");
    String lName = input.nextLine().toUpperCase();

    // create an object with input received
    MemberPlayer m = new MemberPlayer(fName, lName);

    // use contains of List
    if (memberlist.contains(m)) {
        memberlist.remove(m);
    } else {
        System.out.println("This MemberPlayer doesn't exist");
    }
}

Убедитесь, что вы переопределяете методы .equals() и .hashcode() в MemberPlayer.

...