web-dev-qa-db-fra.com

Utilisation de contient dans Java ArrayList <String>

Si j'ai une ArrayList of String faisant partie d'une classe dans Java comme ceci:

private ArrayList<String> rssFeedURLs;

Si je veux utiliser une méthode dans la classe contenant ArrayList ci-dessus, utiliser ArrayList contient pour vérifier si une chaîne est contenue dans cet ArrayList, je pense que je devrais pouvoir le faire comme suit:

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

Où rssFeedURL est une chaîne.

Ai-je raison ou tort?

40
Mr Morgan

Vous avez raison. ArrayList.contains () teste equals (), pas l'identité de l'objet:

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 exception NullPointerException, vérifiez que vous avez initialisé votre liste, dans un constructeur ou dans la déclaration. Par exemple:

private List<String> rssFeedURLs = new ArrayList<String>();
65
Andy Thomas

Oui, cela devrait fonctionner pour Strings, mais si vous craignez les doublons, utilisez un Set. Cette collection empêche les doublons sans que vous ayez à faire quoi que ce soit. Un HashSet peut être utilisé, mais il n'est pas ordonné. Par conséquent, si vous souhaitez conserver l'ordre d'insertion, utilisez un LinkedHashSet.

17

Vous avez raison, cela devrait fonctionner. peut-être avez-vous oublié d'instancier quelque chose. Votre code ressemble-t-il à quelque chose comme ça?

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

Pour référence, notez que la condition suivante sera également exécutée si vous ajoutez ce code à la précédente:

String copyURL = new String(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 true. La méthode contient se soucie de la méthode equals.

3
Michael McGowan

Votre question n'est pas très claire.

  • Que fait votre code exactement? Donne 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 sous la forme d'une valeur renvoyée par contains().

Cependant, vous pouvez obtenir un 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 n'avez-vous pas instancié la liste.

Pour que cela fonctionne (pour ajouter une URL de fil si elle n'est pas déjà dans la liste):

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

alors cette déclaration ferait:

private ArrayList<String> rssFeedURLs = new ArrayList<String>();

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

rssFeedUrls = new ArrayList<String>();

Enfin ... Avez-vous vraiment besoin d'un List? Peut-être qu'un Set serait préférable si vous ne voulez pas de doublons. Utilisez un LinkedHashSet si la préservation de l’ordre importe.

1
haylem

Peut-être avez-vous besoin de poster le code qui a causé votre exception. Si ce qui précède est tout ce que vous avez, vous n’avez peut-être pas réussi à initialiser réellement le tableau.

L'utilisation de contient ici devrait fonctionner si.

1
wds

Vous avez 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 prétendu que vous recherchiez les doublons et c’est pourquoi vous appelez la méthode contient. Essayez d'utiliser HashSet. Cela devrait être plus efficace - sauf si vous devez conserver l'ordre des URL pour une raison quelconque.

0
Aviad Ben Dov

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

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

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

0
Mr Morgan
ArrayList<String> newlyAddedTypes=new ArrayList<String>();

.....

newlyAddedTypes.add("test1");

newlyAddedTypes.add("test1");

newlyAddedTypes.add("test2");

if(newlyAddedTypes.contain("test"){
//called here
}
else{

}
0
Thilina Anuradh

Bon ... avec des chaînes ... dès que vous vous écartez des primitives ou des chaînes, les choses changent et vous devez implémenter hashcode/equals pour obtenir l'effet souhaité.

EDIT: Initialisez votre ArrayList<String> puis essayez d'ajouter un élément.

0
Aaron McIver

Dans le code ci-dessous, nous avons taskfilled en tant qu'arraylist, retrieveTaskidForDelete as, méthode par laquelle nous ajoutons la valeur dans task arraylist et checkid est String. Nous devons vérifier si la valeur de chaîne contient arraylist.

String checkid;
ArrayList<String> taskfilled=retrieveTaskidForDelete();
                if(!taskfilled.contains(checkid)) {
                    Toast.makeText(getContext(),"Yepiee 
 Bingo"+ti.get(a),Toast.LENGTH_SHORT).show();
                }
0
Syed Danish Haider