Utilisation de contains dans Java ArrayList

Si j’ai un ArrayList de Ssortingng faisant partie d’une classe de Java comme ceci:

private ArrayList rssFeedURLs;

Si je veux utiliser une méthode dans la classe contenant la ArrayList ci-dessus, l’utilisation de ArrayList contient pour vérifier si une Ssortingng est contenue dans cette ArrayList, je crois que je devrais pouvoir le faire comme suit:

 if (this.rssFeedURLs.contains(rssFeedURL)) { 

Où rssFeedURL est une chaîne.

Ai-je raison ou tort?

Tu as raison. ArrayList.contains () teste equals (), pas l’identité de l’object:

renvoie true si et seulement si cette liste contient au moins un élément e tel que (o == null? e == null: o.equals (e))

Si vous avez une NullPointerException, vérifiez que vous avez initialisé votre liste, soit dans un constructeur, soit dans la déclaration. Par exemple:

 private List rssFeedURLs = new ArrayList(); 

Oui, cela devrait fonctionner pour les chaînes, mais si vous craignez que des doublons utilisent un Set . Cette collection évite les doublons sans que vous ayez à faire quoi que ce soit. Un HashSet est correct à utiliser, mais il n’est pas ordonné, donc si vous souhaitez conserver l’ordre d’insertion, vous utilisez un LinkedHashSet .

Vous avez raison de dire que cela devrait fonctionner; peut-être vous avez oublié d’instancier quelque chose. Votre code ressemble-t-il à ceci?

 Ssortingng rssFeedURL = "http://stackoverflow.com"; this.rssFeedURLS = new ArrayList(); this.rssFeedURLS.add(rssFeedURL); if(this.rssFeedURLs.contains(rssFeedURL)) { // this code will execute } 

Pour référence, notez que le conditionnel suivant sera également exécuté si vous ajoutez ce code à ce qui précède:

 Ssortingng copyURL = new Ssortingng(rssFeedURL); if(this.rssFeedURLs.contains(copyURL)) { // code will still execute because contains() checks equals() } 

Même si (rssFeedURL == copyURL) est false, rssFeedURL.equals (copyURL) est vrai. La méthode contient se soucie de la méthode égale.

Vous devez peut-être publier le code qui a provoqué votre exception. Si c’est tout ce que vous avez, peut-être que vous n’avez pas réussi à initialiser le tableau.

Utiliser des fichiers ici devrait cependant fonctionner.

Votre question n’est pas très claire.

  • Qu’est-ce que votre code fait exactement? Donnez plus de code.
  • Quelle est l’erreur que vous obtenez?

Vous dites que vous obtenez un pointeur nul. Vous ne pouvez pas obtenir un pointeur null en tant que valeur renvoyée par contains() .

Cependant, vous pouvez obtenir une NullPointerException si votre liste n’a pas été initialisée. En lisant votre question maintenant, je dirais que ce que vous montrez ici est correct, mais peut-être que vous n’avez pas instancié la liste.

Pour que cela fonctionne (pour append une URL de stream s’il ne figure pas déjà dans la liste):

 if (!this.rssFeedURLs.contains(rssFeedURL)) { this.rssFeedURLs.add(rssFeedUrl); } 

alors cette déclaration ferait:

 private ArrayList rssFeedURLs = new ArrayList(); 

ou initialiser votre liste ultérieurement, mais avant d’essayer d’accéder à ses méthodes:

 rssFeedUrls = new ArrayList(); 

Enfin … Avez-vous vraiment besoin d’une List ? Peut-être qu’un Set serait mieux si vous ne voulez pas de doublons. Utilisez un LinkedHashSet si vous conservez les questions de LinkedHashSet .

A droite … avec des chaînes de caractères … au moment où vous déviez des primitives ou des chaînes de caractères, les choses changent et vous devez implémenter un hashcode / equals pour obtenir l’effet désiré.

EDIT: Initialisez votre ArrayList puis essayez d’append un élément.

Tu as raison. Comme d’autres l’ont dit selon vos commentaires, vous n’avez probablement pas initialisé votre ArrayList.

Mon point est différent: vous avez affirmé que vous vérifiez les doublons et que vous appelez la méthode contains. Essayez d’utiliser HashSet . Il devrait être plus efficace – à moins que vous ne deviez garder l’ordre des URL pour quelque raison que ce soit.

Merci à vous tous d’avoir répondu si rapidement. Je pourrais toujours utiliser un ensemble mais j’ai la fonction ArrayList qui fonctionne maintenant. Le problème était que dans le constructeur de la classe contenant ArrayList, je ne disais pas:

 public RSS_Feed_Miner() { ... this.rssFeedURLs = new ArrayList(); ... } 

D’Oh! pour un vendredi après-midi.

 ArrayList newlyAddedTypes=new ArrayList(); ..... newlyAddedTypes.add("test1"); newlyAddedTypes.add("test1"); newlyAddedTypes.add("test2"); if(newlyAddedTypes.contain("test"){ //called here } else{ } 

Dans le code ci-dessous, nous avons rempli la tâche en tant que arraylist, resortingeveTaskidForDelete comme méthode par laquelle nous ajoutons la valeur dans l’arraylist remplie de la tâche et checkid est Ssortingng.nous devons vérifier si la valeur de la chaîne contient arraylist.

 Ssortingng checkid; ArrayList taskfilled=resortingeveTaskidForDelete(); if(!taskfilled.contains(checkid)) { Toast.makeText(getContext(),"Yepiee Bingo"+ti.get(a),Toast.LENGTH_SHORT).show(); }