2010-10-15 10 views
37

Si tengo un ArrayList de cadena que forman parte de una clase en Java, así:El uso de contiene en Java ArrayList <String>

private ArrayList<String> rssFeedURLs;

Si quiero utilizar un método en la clase que contiene el ArrayList anteriormente , utilizando ArrayList contiene para comprobar si una cadena está contenida en este ArrayList, creo que debería ser capaz de hacerlo de la siguiente manera:

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

Dónde rssFeedURL es una cadena.

¿Estoy bien o mal?

+7

Si ya tiene el código allí, ¿por qué no puede probarlo? Contiene devuelve verdadero si el elemento está en la lista y falso en caso contrario. – Chris

+1

Lo he intentado pero por alguna razón no funciona. Cuando intento agregar una entrada a ArrayList, primero compruebo el contenido para evitar duplicados, pero obtengo un puntero nulo. No puedo ver por qué? –

+0

Necesita crear una instancia de ArrayList

Respuesta

0

Derecha ... con cuerdas ... en el momento en que se desvía de las primitivas o de las cuerdas, las cosas cambian y debe implementar códigos hash/iguales para obtener el efecto deseado.

EDITAR: Inicializa tu ArrayList<String> y luego intenta agregar un artículo.

+0

¿Qué quiere decir? Por un lado, las cadenas no son primitivas de todos modos, y en segundo lugar, este modismo funciona correctamente con cualquier objeto (siempre que sus métodos 'equals' y' hashcode' se implementen correctamente). –

+0

Correcto, pero sin implementar equals/hashcode, no funcionará por defecto (como OP teorizaría) ... y en base a esta pregunta supongo que el OP obviamente no está enterado de eso ... y sí Las cadenas no son primitivas, pero sí En el momento en que se desvía de Cadena y/o primitiva, necesita implementar códigos hash/iguales para obtener los resultados esperados. –

+0

@Andrzej Doyle editado para ser más claro –

16

Sí, eso debería funcionar para Strings, pero si le preocupan los duplicados, utilice Set. Esta colección evita duplicados sin que tengas que hacer nada. Puede usar un HashSet, pero no está ordenado, por lo que si desea conservar el orden de inserción, utilice un LinkedHashSet.

+0

Usted quiso decir 'LinkedHashSet', no' LinkedListSet'. – haylem

+0

Punto justo, pero no sirve de mucho si el propósito de la lista es evitar el doble _procesamiento_ en lugar de las _entradas dobles en la lista real_. – Nyerguds

1

Quizás necesite publicar el código que causó su excepción. Si todo lo anterior es todo lo que tienes, quizás no hayas inicializado la matriz.

El uso de contiene aquí debería funcionar bien.

62

Tienes razón. (ArrayList.contains) Pruebas de equals(), no se oponga identidad:

devuelve verdadero si y sólo si esta lista contiene al menos un elemento e tal que (o == null e == null:? O .equals (e))

Si obtuvo NullPointerException, verifique que haya inicializado su lista, ya sea en un constructor o en la declaración. Por ejemplo:

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

Su pregunta no es muy clara.

  • ¿Qué hace exactamente tu código? Dar más código.
  • ¿Cuál es el error que está obteniendo?

Dice que obtiene un puntero nulo. No puede obtener un puntero nulo como un valor devuelto por .

Sin embargo, puede obtener un NullPointerException si su lista no se ha inicializado. Al leer su pregunta ahora, diría que lo que muestra aquí es correcto, pero tal vez simplemente no creó una instancia de la lista.

Para que esto funcione (para añadir una URL de alimentación si no está ya en la lista):

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

entonces esta declaración haría:

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

o inicializar la lista más adelante , pero antes de intentar acceder a sus métodos:

rssFeedUrls = new ArrayList<String>(); 

Finalmente ... ¿Realmente necesitas un List? Quizás un Set sería mejor si no quieres duplicados. Use un LinkedHashSet si preserva el orden.

0

Estás en lo correcto. Como otros dijeron de acuerdo con sus comentarios, probablemente no haya inicializado su ArrayList.

Mi punto es diferente: afirmó que está buscando duplicados y es por eso que llama al método contains. Intenta usar HashSet. Debería ser más eficiente, a menos que deba mantener el orden de las URL por cualquier motivo.

3

Tiene razón de que debería funcionar; tal vez te olvidaste de crear una instancia de algo. ¿Su código se ve algo como esto?

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

Como referencia, tenga en cuenta que el siguiente condicional también se ejecutará si agrega este código al anterior:

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

A pesar de que (== rssFeedURL copyURL) es falsa, rssFeedURL.equals (copyURL) es verdad. El método contains se preocupa por el método igual.

0

Gracias a todos por responder tan rápido. Siempre podría usar un conjunto, pero tengo el ArrayList funcionando ahora. El problema fue que en el constructor de la clase que contiene el ArrayList, no estaba diciendo:

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

D'Oh! para un viernes por la tarde.

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

..... 

newlyAddedTypes.add("test1"); 

newlyAddedTypes.add("test1"); 

newlyAddedTypes.add("test2"); 

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

} 
0

En el código de abajo hemos taskfilled como ArrayList, retrieveTaskidForDelete como método por el cual se añade el valor en la tarea llena ArrayList y checkID es String.we necesario comprobar si el valor de cadena contiene en ArrayList.

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

Agregue una explicación en su respuesta, no solo proporcione el código. – lifeisfoo

Cuestiones relacionadas