Retirez le même nombre d'une liste de tableaux
J'ai créer une méthode qui a une liste de tableaux; j'ai besoin de supprimer des numéros de cette liste de tableaux. J'ai écrit du code, mais il y a une erreur de logique, je ne pouvais pas identifier.
Voici mon code:
static void sortList(){
List <Integer> number=new ArrayList <Integer>();
number.add(11);
number.add(45);
number.add(12);
number.add(32);
number.add(36);
System.out.println("Unsorted List: "+number);
for (int i=0;i<number.size();i++){
int even=number.get(i)%2;
if (even==0){
System.out.println("This is Even Number:"+ number.get(i));
number.remove(i);
}
}
Collections.sort(number);
System.out.println("Sorted List: "+number);
}
La sortie du code est:
Unsorted List: [11, 45, 12, 32, 36]
This is Even Number:12
This is Even Number:36
Sorted List: [11, 32, 45]
Je me demande pourquoi 32 n'est pas pris comme un nombre pair, car c'est un nombre pair, j'ai testé ensuite, à l'aide de différentes le même nombre au même poste, mais le résultat est le même. Pourquoi au niveau de l'index(3) il n'arrive que tout nombre pair n'a pas pu être prises. Je me demande vraiment pourquoi. Donc, svp quelqu'un peut m'aider pour cela et est-il un autre de meilleure façon de mettre en œuvre cette solution.
Grâce
- Vous sont en train de modifier la liste lors de l'itération sur elle. Une solution simple consiste à itérer vers l'arrière sur la liste.
Vous devez vous connecter pour publier un commentaire.
Utiliser un
Iterator
. Il a uneremove()
méthode dont vous avez besoin.Lorsque vous supprimez quelque chose à partir de la liste, les indices du tout après que les changements!
Plus précisément, de la mise en œuvre 32 n'est pas supprimé comme il vient directement après l'autre même nombre.
Je voudrais utiliser un Itérateur à marcher sur la liste, et l'opération de suppression sur que itérateur au lieu de cela, quelque chose comme ceci:
ArrayList
. Qui peut ou peut ne pas être un problème.ArrayList
indépendamment de la façon dont vous le faites. Mais les débutants devraient savoir que l'utilisation d'index pour effectuer une itération sur unLinkedList
vous donnera O(n^2), mais en utilisant un itérateur sera toujours en O(n) - j'ai vu que cela fait mal, un nombre incalculable de fois...Deux réponses à propos de la liste des indices de changement sont corrects. Cependant, gardez à l'esprit que la suppression d'un élément à partir d'une liste de tableaux est lent, car il a fait lecture aléatoire de toutes les entrées suivantes vers le bas. Au lieu de cela, je vous recommande de créer une nouvelle liste contenant uniquement les numéros, et puis il suffit de jeter la vieille liste. Si vous souhaitez utiliser l'Itérateur à base de supprimer le code dans l'autre réponse, cela fonctionnera très bien pour les petits les résultats comme il est, et pour les grands ensembles de données si vous utilisez LinkedList. (Je crois que c'est le nom; mon Java est certes légèrement rouillé.)
Si vous supprimez une entrée de la liste alors que boucler sur elle, vous aurez à régler votre indice de boucle. N'oubliez pas, en supprimant l'élément réduit la longueur de la liste par un, et de manière efficace "shuffle back" l'indice de tous les éléments d'après elle.
Le problème (comme d'autres l'ont mentionné), c'est que vous êtes en train de modifier la liste alors que vous êtes le traverser. Essayez d'ajouter un "i--;" ligne à l'intérieur de votre "si (même==0)" bloquer. Comme ceci:
Voici une autre manière astucieuse de filtrage pour les impair d'éléments. Au lieu de boucle à travers la collection manuellement, décharger le travail à Apache Commons Collections
On peut se demander si c'est réellement plus facile à lire et à comprendre, mais c'est plus amusant. Si un certain type de Prédicat est fréquemment utilisé, il peut être reconstruit dans une constante statique et réutilisés dans tous les sens. Cela pourrait tourner à l'utilisation de celui-ci en quelque chose de beaucoup plus propre:
Ce que je fais (Intelliji avec kotlin)
résultat=2,4,6
Nous pouvons utiliser removeIf méthode par défaut dans la classe ArrayList .