2010-01-25 38 views
65

Estoy usando ArrayList<String> y agrego datos en índices específicos, ¿cómo puedo verificar si existe un índice específico?java: ArrayList: ¿cómo puedo verificar si existe un índice?

¿Debo simplemente get() y comprobar el valor? ¿O debería esperar una excepción? ¿Hay alguna otra manera?

actualización

Gracias por sus respuestas, sino porque sólo estoy agregando cosas en índices específicos, la longitud de la lista no me los cuales están disponibles mostrará.

+2

Tenga una mirada en un Conjunto quizás su más se adapte a lo que necesita? –

+1

nice ... 5 respuestas en un minuto! – jwoolard

+3

Luego vas a tener que 'get()' y verificar 'null'; sin embargo, no confíes en las excepciones. Considere el uso de un 'HashTable' en su lugar http://java.sun.com/j2se/1.4.2/docs/api/java/util/Hashtable.html – Amarghosh

Respuesta

99

El método arrayList.size()returns el número de elementos en la lista, por lo que si el índice es mayor o igual que size(), no existe.

+8

Eso debería ser "mayor o igual que' size() '" ya que es un índice basado en cero. – McDowell

+0

@McDowell - oops, lo arregló. Gracias. – Amarghosh

+1

También vale la pena mencionar que para hacer este atómico probablemente debería realizar la comprobación de tamaño() y la búsqueda basada en el índice condicional correspondiente mientras bloquea la lista. – Adamski

0

Si su índice es menor que el tamaño de su lista, entonces existe, posiblemente con null valor. Si el índice es más grande, puede llamar al ensureCapacity() para poder usar ese índice.

Si desea comprobar si un valor en el índice es null o no, llame get()

+1

Llamar EnsureCapacity (int) no aumentará el tamaño de la lista , solo la capacidad; es decir, "tamaño potencial", por lo que las búsquedas de índices fuera de límites seguirán fallando. – Adamski

+0

Además, ¿por qué llamar a ensureCapacity (int) en absoluto? Podría ser una operación increíblemente costosa si, por ejemplo, el tamaño actual de la lista es 5 y desea determinar el valor del elemento #: 100,000,000. – Adamski

+0

Quise decir que los índices menores que size() siempre existen, aquellos que son> = size() no y no pueden usarlos (== call set()) hasta que la lista sea lo suficientemente grande. Llamar EnsureCapacity no es suficiente, hay que cambiar el tamaño agregando elementos. – Dmitry

3

puede comprobar el tamaño de un ArrayList utilizando el método size(). Esto devolverá el índice máximo +1

0

Puede verificar el tamaño de la matriz.

package sojava; 
import java.util.ArrayList; 

public class Main { 
    public static Object get(ArrayList list, int index) { 
     if (list.size() > index) { return list.get(index); } 
     return null; 
    } 

    public static void main(String[] args) { 
     ArrayList list = new ArrayList(); 
     list.add(""); list.add(""); list.add("");   
     System.out.println(get(list, 4)); 
     // prints 'null' 
    } 
} 
9

Esto es lo que necesita ...

public boolean indexExists(final List list, final int index) { 
    return index >= 0 && index < list.size(); 
} 

Por qué no utilizar una matriz simple y llano? El acceso indexado a una lista es un olor a código, creo.

+1

No siempre, ya que podría querer que la ArrayList crezca con el tiempo, y que una matriz no pueda funcionar. – Coyote21

6

En cuanto a su actualización (que probablemente debería ser otra pregunta). Se debe utilizar una gran variedad de estos objetos en su lugar un ArrayList, por lo que simplemente puede comprobar el valor de nulo:

Object[] array = new Object[MAX_ENTRIES]; 
.. 
if (array[ 8 ] == null) { 
    // not available 
} 
else { 
    // do something 
} 

Mejor Práctica-

Si usted no tiene cientos de entradas en la matriz debería considerar organizarlo como clase para deshacerse de los números mágicos 3,8, etc.

El flujo de control con la excepción es una mala práctica.

54

Si bien recibió una docena de sugerencias sobre cómo usar el tamaño de su lista, que funciona para las listas con entradas lineales, nadie pareció leer su pregunta.

Si agrega entradas manualmente en índices diferentes, ninguna de estas sugerencias funcionará, ya que necesita verificar un índice específico.

Usando if (list.get (index) == null) tampoco funcionará, ya que get() arroja una excepción en lugar de devolver null.

Prueba esto: se añade

try { 
    list.get(index); 
} catch (IndexOutOfBoundsException e) { 
    list.add(index, new Object()); 
} 

Aquí una nueva entrada si el índice no existe. Puedes modificarlo para hacer algo diferente.

+2

Gracias, necesitaba esta técnica para probar en unidades si existen índices de matriz. – Noumenon

+4

Recuerde evitar usar 'try/catch' para este tipo de trabajo, ralentizará su programa en un 50% o tal vez más ... la comprobación de errores agrega como una correa a su código existente para ralentizarlo ... mejor evitarlo en áreas críticas La verificación de 'longitud' en este caso es lo mejor que se puede hacer, ya que el 'índice' siempre será menor que el 'largo ', el'índice' antiguo cambiará y se convertirá en el nuevo' índice' si 'eliminar' ellos así que es por eso que la regla que comprueba' length' siempre funcionará. – SSpoke

+1

@SSpoke ... Aunque estoy de acuerdo, try/catch está lejos de ser una 'buena' respuesta; abordará el problema cuando la lista es escasa. Prefiero la sugerencia de usar una matriz: Object [] ary; debajo o un hash. – will

1

Prueba rápida y sucia de si existe un índice o no. en su implementación, reemplace la lista Con su lista está realizando pruebas.

public boolean hasIndex(int index){ 
    if(index < list.size()) 
     return true; 
    return false; 
} 

o para ArrayLists 2Dimensional ...

public boolean hasRow(int row){ 
    if(row < _matrix.size()) 
     return true; 
    return false; 
} 
+1

La lista no tiene '.length' tiene' list.size() 'pero no es un gran problema. Me equivoco todo el tiempo jaja. Depende del compilador para guiarme en eso. Probablemente estabas pensando en matrices primitivas – SSpoke

+1

Gracias por captar eso. La cardinalidad de los contenedores puede ser fácil de olvidar. – t3dodson

1

Desde java-9 hay una forma estándar de comprobar si un índice pertenece a la matriz - Objects#checkIndex():

List<Integer> ints = List.of(1,2,3); 
System.out.println(Objects.checkIndex(1,ints.size())); // 1 
System.out.println(Objects.checkIndex(10,ints.size())); //IndexOutOfBoundsException 
+0

El método 'of()' también se agrega en ** Java 9 ** a la clase ** List **: https://docs.oracle.com/javase/9/docs/api/java/util/List .html # of-- – Orici

0

Por lo general los compruebe si el índice es menor que el tamaño de la matriz

if (index < list.size()) { 
    ... 
} 

Si también está preocupado de índice es un valor negativo, el uso siguiente

if (index >= 0 && index < list.size()) { 
    ... 
} 
+0

¿Cómo proporciona esto algún valor sobre la [Respuesta aceptada] (https://stackoverflow.com/a/2131825/642706) de hace varios años? –

+0

Supongo que en su opinión no proporciona ningún valor, pero vi un comentario de roberto tomás sobre la respuesta aceptada, suponiendo que no entendió bien la respuesta aceptada. compruébelo "con una nueva lista Voy a comenzar en el índice = 0 y mi list.size() == 0 también, así que la primera vez que lo verifique será verdadero" Decidí publicar una respuesta por separado para ayudar a cualquier confusión futura. – AamirR

Cuestiones relacionadas