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?
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>();
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
.
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.
Votre question n'est pas très claire.
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.
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.
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.
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.
ArrayList<String> newlyAddedTypes=new ArrayList<String>();
.....
newlyAddedTypes.add("test1");
newlyAddedTypes.add("test1");
newlyAddedTypes.add("test2");
if(newlyAddedTypes.contain("test"){
//called here
}
else{
}
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.
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();
}