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; } } }
4 Réponses :
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
.
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.
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; } }
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(); } }
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; } } }
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?