2010-10-15 16 views
37

Se ho un ArrayList di stringa che fa parte di una classe in Java in questo modo:Uso di contiene in Java ArrayList <String>

private ArrayList<String> rssFeedURLs;

Se voglio usare un metodo nella classe che contiene l'ArrayList sopra , utilizzando ArrayList contiene per verificare se una stringa è contenuta in questo ArrayList, credo che dovrei essere in grado di farlo nel modo seguente:

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

Dove rssFeedURL è una stringa.

Ho ragione o no?

+7

Se il codice è già presente, perché non lo si può provare? Contiene restituisce true se l'elemento è nella lista e false altrimenti. – Chris

+1

Ho provato questo, ma per qualche motivo non funziona. Quando provo ad aggiungere una voce a ArrayList, per prima cosa controllo contiene per evitare duplicati, ma ottengo un puntatore nullo. Non riesco a vedere perché? –

+0

È necessario creare un'istanza di ArrayList

risposta

0

Giusto ... con stringhe ... nel momento in cui si devia da primitive o stringhe le cose cambiano e occorre implementare hashcode/equals per ottenere l'effetto desiderato.

MODIFICA: inizializza il tuo ArrayList<String> quindi prova ad aggiungere un elemento.

+0

Cosa intendi? Per uno, le stringhe non sono comunque primitive - e in secondo luogo, questo idioma funziona correttamente con qualsiasi oggetto (a patto che i suoi metodi 'equals' e' hashcode' siano implementati correttamente). –

+0

Corretto ma senza implementare equals/hashcode non funzionerà di default (come teorizzerebbe l'OP) ... e in base a questa domanda credo che l'OP ovviamente non ne sia consapevole ... e sì Le stringhe non sono primitive ma nel momento in cui dividi la forma String e/o la primitiva devi implementare hashcode/equals per ottenere i risultati attesi. –

+0

@Andrzej Doyle modificato per essere più chiaro –

16

Sì, questo dovrebbe funzionare per le stringhe, ma se si è preoccupati per i duplicati utilizzare uno Set. Questa raccolta previene i duplicati senza che tu debba fare nulla. A HashSet è OK da usare, ma non è ordinato, quindi se si desidera mantenere l'ordine di inserimento si utilizza un LinkedHashSet.

+0

Intendevi 'LinkedHashSet', non' LinkedListSet'. – haylem

+0

Punto giusto, ma non è molto utile se lo scopo della lista è evitare doppio _processing_ piuttosto che double _entries nella lista attuale_. – Nyerguds

1

Forse è necessario pubblicare il codice che ha causato l'eccezione. Se quanto sopra è tutto ciò che hai, forse non sei riuscito a inizializzare realmente l'array.

L'utilizzo di contiene qui dovrebbe funzionare comunque.

62

Hai ragione. ArrayList.contains() Test equals(), non oggetto identità:

restituisce vero se e solo se questa lista contiene almeno un elemento e tale che (o == null e == null:? O .equals (e))

Se si dispone di una NullPointerException, verificare di aver inizializzato l'elenco, in un costruttore o nella dichiarazione. Ad esempio:

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

La tua domanda non è molto chiara.

  • Cosa sta facendo esattamente il tuo codice? Dare più codice.
  • Qual è l'errore che stai ottenendo?

Si dice che si ottiene un puntatore nullo. Non è possibile ottenere un puntatore nullo come valore restituito da .

Tuttavia è possibile ottenere un NullPointerException se l'elenco non è stato inizializzato. Leggendo la tua domanda ora, direi che quello che mostri qui è corretto, ma forse non hai appena creato un'istanza della lista.

Per farlo funzionare (per aggiungere un URL del feed, se non è già nella lista):

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

allora questa dichiarazione avrebbe fatto:

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

o inizializzare la vostra lista in seguito , ma prima di tentare di accedere ai suoi metodi:

rssFeedUrls = new ArrayList<String>(); 

Infine ... Avete davvero bisogno di un List? Forse un Set sarebbe meglio se non vuoi duplicati. Utilizzare un LinkedHashSet se la conservazione dell'ordine è importante.

0

Sei corretto. Come altri hanno detto in base ai tuoi commenti, probabilmente non hai inizializzato il tuo ArrayList.

Il mio punto è diverso: hai affermato che stai controllando i duplicati ed è per questo che chiami il metodo contiene. Prova a utilizzare HashSet. Dovrebbe essere più efficiente, a meno che non sia necessario mantenere l'ordine degli URL per qualsiasi motivo.

3

Hai ragione che dovrebbe funzionare; forse hai dimenticato di istanziare qualcosa. Il tuo codice ha un aspetto simile a questo?

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

Per avere un riferimento, si noti che la seguente condizione sarà anche eseguito se si aggiunge questo codice a quanto sopra:

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

Anche se (rssFeedURL == copyURL) è falso, rssFeedURL.equals (copyURL) è vero. Il metodo contiene riguarda il metodo degli uguali.

0

Grazie a tutti per aver risposto così velocemente. Potrei sempre usare un set ma ora ho ArrayList. Il problema è stato che nel costruttore della classe che contiene l'ArrayList, non ero dicendo:

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

D'oh! per un venerdì pomeriggio.

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

..... 

newlyAddedTypes.add("test1"); 

newlyAddedTypes.add("test1"); 

newlyAddedTypes.add("test2"); 

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

} 
0

Nel seguente codice abbiamo taskfilled come arraylist, retrieveTaskidForDelete come metodo con il quale aggiungere il valore compito riempito arraylist e checkid è String.we necessario controllare se il valore stringa contiene in arraylist.

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

Si prega di aggiungere una spiegazione nella risposta, non solo fornire il codice. – lifeisfoo