En supprimant les doublons d'une Liste en Java à l'aide d'itérateurs
Im essayant de travailler sur une question d'attribution pour mon intro java cours où l'on est censé supprimer les doublons dans une liste sans l'aide des ensembles ou la .méthode contains (). Fondamentalement, il suffit d'utiliser les itérateurs et les .méthode equals (). Mon code est comme suit:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class sample {
public static void main(String[] args) throws BadListException {
List<String> myList = new ArrayList<String>();
myList.add("A");
myList.add("B");
myList.add("B");
myList.add("C");
myList.add("B");
myList.add("D");
unique(myList);
System.out.println(myList);
}
public static List<String> unique( List<String> items ) throws BadListException {
List<String> newList = new ArrayList<String>();
Iterator<String> itr = items.listIterator();
//If items is null, throw a BadListException.
if (items == null){
throw new BadListException();
}
//If items is empty, return a new empty list.
if (items.isEmpty()){
return newList;
}
//Otherwise create and return a new list that contains the items
//in L with all duplicates removed.
//Example: items: "A","B","C" result: "A","B","C"
//Example: items: "A","A","A" result: "A"
//Example: items: "A","B","B","C","A","D" result: "A","B","C","D"
while (itr.hasNext()){
for (int i = 0; i < items.size()-1; i++){
if (itr.next().equals(items.get(i))){
itr.remove();
}
}
}
items = newList;
return newList;
Si quelqu'un pouvait expliquer ce que je fais mal et comment je dois faire de la place qui serait très utile. Veuillez noter que, puisque c'est de me préparer pour un test, je vous serais reconnaissant une explication plutôt que de simplement le bon morceau de code.
Une excellente façon de le phrasé d'un "devoirs à la question"! Maintenant, pouvez-vous nous dire comment/où les choses vont mal ou que vous?
vous êtes de retour à la
Eh bien tout d'abord le premier élément de la collection obtient toujours effacé (ce que je crois est parce que le premier élément itérée est toujours égale à elle-même, pour éviter cela, je pouvais commencer ma boucle for à l'indice 1 au lieu de l'index 0 et qui permettrait de résoudre le problème je pense), mais plus important encore, lorsque j'ajoute un article en double à tout autre endroit que juste à côté de l'élément lui-même (par exemple. A, B, C, B) ensuite, le programme continue de fonctionner indéfiniment. Juste une précision: le programme ne fonctionne pas comme prévu si j'ai garder tous les éléments en double côte à côte et newList est retourné sans doublons.
vous êtes de retour à la
newList
qui vous de ne jamais changer.Eh bien tout d'abord le premier élément de la collection obtient toujours effacé (ce que je crois est parce que le premier élément itérée est toujours égale à elle-même, pour éviter cela, je pouvais commencer ma boucle for à l'indice 1 au lieu de l'index 0 et qui permettrait de résoudre le problème je pense), mais plus important encore, lorsque j'ajoute un article en double à tout autre endroit que juste à côté de l'élément lui-même (par exemple. A, B, C, B) ensuite, le programme continue de fonctionner indéfiniment. Juste une précision: le programme ne fonctionne pas comme prévu si j'ai garder tous les éléments en double côte à côte et newList est retourné sans doublons.
OriginalL'auteur user1542396 | 2013-03-03
Vous devez vous connecter pour publier un commentaire.
Plutôt que d'expliquer exactement ce qui ne va pas, je vais vous suggérons d'utiliser un débogueur pour voir ce que le programme est actuellement en train de faire. En particulier, regardez ce que l'itérateur est de retour à chaque fois que vous appelez
iter.next()
.Conseils pour une solution correcte:
Dans l'avenir, lorsque vous posez une question, vous devez fournir un meilleur état de ce que le programme est en fait censé faire. Par exemple:
unique
méthode est censée supprimer des éléments de la liste d'arguments ou de retourner une nouvelle liste contenant (juste) les éléments uniques.Toutes ces choses qui comptent pour décider de la façon de résoudre un problème comme celui-ci. En particulier dans le monde réel. Même votre affectation n'ont pas fait état de ces choses, vous avez encore besoin de vous faire votre propre idée comment votre code est destiné à travailler ... et ce document avec les commentaires javadoc.
OriginalL'auteur Stephen C
i==0
votreiterator.next()
etget(i)
serait le même élément, de sorte que vous venez de retirer.iterator.remove()
dans unfor
boucle.add
rien à lanewList
, et l'a retourné tout simplementvous pourriez d'abord sorte la liste, puis allez à travers elle, si un élément est égale à la précédente, supprimer l'élément. Vous pouvez bien sûr créer une nouvelle liste de tenir ces éléments uniques, si vous le souhaitez.
mes 2 cents
vous êtes de droite. l'ordre de e doit être changé par le tri. Ensuite, la question de la cession doit définir, comment faire pour supprimer les doublons. par exemple, "gardez toujours le premier/dernier/n-ième élément, si dup trouvé". sinon, l'ordre pourrait être "changé". de toute façon si le Q est définie ainsi, la solution n'est pas difficile à mettre en. ainsi, en gardant
nth
élément peut être difficile.OriginalL'auteur Kent
Itérer sur une liste et de suppression des éléments les modifications de la liste... Si vous avez regardé l'élément "4" et a décidé de le retirer, ce qui est l'élément suivant que vous regardez? Indice: ce n'est pas l'élément d'origine "5", mais le nouvel élément ”5”...
OriginalL'auteur Floris
Vous pouvez simplement créer votre propre itérateur, dont l'objet est seulement de retour d'un double de la valeur une fois.
Utilisation:
OriginalL'auteur Alan Smith
OriginalL'auteur Vidyarani Shinde
Un autre moyen simple de le faire est comme ci-dessous.
Méthode d'essai pour remplir la liste est copié à partir de Vidyarani Shinde de réponse.
OriginalL'auteur Kishor Raskar
très simple
way is ..first to check the list has that value if so ,skip adding it if not add the element and u get your unique list...instead of running intensive Iterator operation :)
Example
OriginalL'auteur danielad
J'ai utilisé les deux avancées de chacun et également tenté par la conversion de
ArrayList
àHashSet
et de nouveau àArrayList
. À la fois de la solution fonctionne très bien. Vous pouvez choisir n'importe quelOriginalL'auteur Rizwan Khan
Ci-dessous est la solution :
OriginalL'auteur Peter
Supposer que
ArrayList
implémenteListADT
, que leArrayList
etArrayListIterator
classes sont mises en œuvre comme prévu, et queBadListException
est décochée exception avec un zéro argument du constructeur. Supposons aussi que les éléments null ne peut pas être ajouté à une liste.J'ai pour valider la méthode en Java spécifié ci-dessous, l'utilisation des itérateurs. Ma solution doit répondre à ces exigences:
contains
méthodeListADT
méthodes (saufcontains
) décrits dans le sur la ligne de lecture, y comprisListADT.iterator()
, mais ne doit pas utiliser n'importe quel autreList
méthodes ne sont pas mentionnés, il yLe squelette de la fonction:
Je dois m'assurer que ma solution n'utilise que les méthodes qui sont dans les
ListADT
interface décrite dans la ligne de lecture (y compris une méthode d'itérateur, comme mentionné ci-dessus).Comment puis-je faire cela?
OriginalL'auteur allyson