1
votes

comment supprimer un objet spécifique dans une ArrayList tout en utilisant un scanner en java

J'essaye de supprimer un MemberPlayer (objet) de mon ArrayList (memberList) via mon entrée (scanner)

J'ai essayé de regarder autour de Google et Stack mais je n'arrive pas à trouver quoi que ce soit qui utilise le scanner.

ANDERS
ANDERSEN 23 1

BERT BERSEN 16 2

HANS HANSEN 25 1

TIM TIMSEN 20 2
MORTEN MORTENSEN 34 1

J'ai lu ma liste de membres à partir d'un fichier.txt avec les informations suivantes: prénom, nom, âge et équipe.

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


1 commentaires

Est-ce que l'une des réponses a fonctionné pour vous? Si oui, envisagez de voter / en accepter un. Que dois-je faire lorsque quelqu'un répond à ma question?


4 Réponses :


0
votes

Vous devez utiliser Liste # remove () , de la documentation:

boolean remove (Object o)

Supprime la première occurrence de l'élément spécifié élément de cette liste, s'il est présent (opération optionnelle). Si ce list ne contient pas l'élément, il est inchangé. Plus formellement, supprime l'élément avec l'indice i le plus bas tel que (o == null? get (i) == null: o.equals (get (i))) (si un tel élément existe). Retour true si cette liste contenait l'élément spécifié (ou de manière équivalente, si cette liste a été modifiée suite à l'appel).


De plus, vous n'avez pas besoin d'un for-loop ici. Votre méthode peut être simplifiée à une approche beaucoup plus OO:

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

Assurez-vous de remplacer les .equals () et Méthodes .hashcode () dans MemberPlayer.


3 commentaires

J'ai dérangé votre solution et je n'arrive pas à la faire fonctionner. J'ai ajouté un constructeur dans MemberPlayer pour gérer le nouvel objet et je ne suis pas tout à fait sûr de ce que vous entendez en remplaçant les .equals () et .hashcode ()


Quel IDE utilisez-vous? Vous pouvez générer automatiquement ces méthodes. Vous pouvez essayer une recherche Google pour savoir comment les générer. Je serais ravi de vous aider si vous rencontrez toujours des problèmes.


Pourquoi devrions-nous remplacer égaux et hashcode pourrait vous aider davantage.



0
votes

Je recommande d'utiliser un Iterator pour cela, car l'utilisation de List.remove (Object o) peut lancer l'exception ConcurrentModificationException lorsque vous changez l'état de l'objet lors de l'itération.

Donc Iterator.remove () sera une valeur sûre. À partir de la documentation Java SE 1.8 :

Les itérateurs permettent à l'appelant de supprimer des éléments du sous-jacent collection pendant l'itération avec une sémantique bien définie .

Donc, supprimer un objet directement de la List en utilisant List.remove () provoquera une itération imprévisible et lancera ConcurrentModificationException pendant en l'itérant.

Si vous n'êtes pas en train de itérer , vous pouvez utiliser List.remove (Object o) pour supprimer l'objet du Liste .

//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 commentaires

0
votes

N'oubliez pas que vous ne pouvez pas supprimer un élément Collection pendant que vous l'itérez en utilisant la boucle for-each . Dans ce cas, une ConcurrentModificationException peut être lancée.

Vous devez explicitement utiliser un Interator ou un ListIterator , selon le cas d'utilisation.
Un ListIterator permet également d'insérer des éléments ou de paramétrer des éléments.

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 commentaires

0
votes

c'est ce qui a fonctionné pour moi après quelques essais et erreurs.

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 commentaires