2011-02-10 13 views

Respuesta

176

Hay un par de maneras de lograr esto usando la clase de utilidad Arrays.

Si la matriz no está ordenada:

java.util.Arrays.asList(theArray).indexOf(o) 

Si se ordena la matriz, se puede hacer uso de una búsqueda binaria para la prestación del servicio:

java.util.Arrays.binarySearch(theArray, o) 
+2

Estoy bastante seguro de que esta respuesta es incorrecta al menos para java 1.6: http://download.oracle.com/javase /6/docs/api/java/util/Arrays.html#asList(T ...) asList transforma la lista de argumentos en una lista, no el argumento en sí. – Alexandru

+7

El manejo de @Alexandru Ellipsis es azúcar sintáctico. Si tiene un argumento escrito 'T ...', el tipo de tiempo de ejecución real del argumento es 'T []', y pasar cero o más parámetros de tipo 'T' da como resultado que se envuelvan en una matriz recién construida y pasado. Si el parámetro que se pasa ya es de tipo 'T []', se pasa por alto el azúcar sintáctico. –

+4

Veo tu punto. La solución ('.indexOf') no es válida para primitivos, sin embargo. – Alexandru

10

Java ArrayList tiene un método indexOf. Las matrices de Java no tienen dicho método.

+23

No solo 'ArrayList' - cada Java' List' tiene 'indexOf()'. –

4

Las matrices no tienen ese método. Una lista, sin embargo, sí: indexOf

+2

No solo 'ArrayList' - cada' Lista 'de Java tiene' indexOf() '. –

+0

Sí, acabo de especificar ArrayList porque puede ser lo más parecido a lo que estaba buscando el OP :) – Igor

6

No recuerdo de un "indexOf" en matrices distintas de la codificación por sí mismo ... aunque probablemente podría utilizar uno de los muchos métodos java.util.Arrays#binarySearch(...) (ver la Arrays javadoc) si su matriz contiene tipos primitivos

5

La interfaz Lista tiene un método indexOf(), y puede obtener una Lista de su matriz con el método asList() de Array. Aparte de eso, Array en sí no tiene ese método. Tiene un método binarySearch() para arreglos ordenados.

18

No hay ninguna. O bien utilizar un java.util.List *, o puede escribir su propio indexOf():

public static <T> int indexOf(T needle, T[] haystack) 
{ 
    for (int i=0; i<haystack.length; i++) 
    { 
     if (haystack[i] != null && haystack[i].equals(needle) 
      || needle == null && haystack[i] == null) return i; 
    } 

    return -1; 
} 

* usted puede hacer uno de su matriz mediante Arrays#asList()

+2

Usar 'T' es engañoso. No proporciona ningún tipo de seguridad, fácil de confundir, es de tipo seguro ... mejor uso Objeto –

+4

@VenkataRaju, utilizando T aquí fuerza ambos parámetros del método para ser del mismo tipo. Eso es útil. – gonadarian

+4

@gonadarian No realmente. Ambas compilaciones simplemente bien: 'indexOf (" str ", new Object [] {});', 'indexOf (new Object(), new String [] {});' –

46

matriz tiene ningún método indexOf().

Tal vez este método ArrayUtils Apache Commons Lang es lo que busca

import org.apache.commons.lang3.ArrayUtils; 

String[] colours = { "Red", "Orange", "Yellow", "Green" }; 

int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow"); 
+0

Eclipse no encuentra esta biblioteca de importación. – Omore

15

Por primitivas, si se quiere evitar el boxeo, Guava tiene ayudantes para las matrices primitivas por ejemplo, Ints.indexOf ([] int matriz, objetivo int)

+0

Las otras soluciones crean cadenas o listas nuevas o simplemente manejan elementos individuales. Guava's Chars.indexOf te permite obtener el índice de una matriz en una matriz. Esta es la solución correcta. – HappyEngineer

12

diferencia en C# donde se tiene el método Array.IndexOf, y JavaScript donde se tiene el método indexOf, API de Java (los Array y Arrays clases, en particular) no tienen ese método.

Este método indexOf (junto con su complemento lastIndexOf) se define en la interfaz java.util.List. Tenga en cuenta que indexOf y lastIndexOf no están sobrecargados y solo toman un objeto como parámetro.

Si la matriz está ordenada, estás de suerte porque la clase Arrays define una serie de sobrecargas del método busquedaBinaria que encontrar el índice del elemento que busca con el mejor rendimiento posible (O (log n) en lugar de O (n), siendo esto último lo que puede esperar de una búsqueda secuencial realizada por indexOf).Hay cuatro consideraciones:

  1. La matriz debe ser ordenada, ya sea en el orden natural o en el orden de un comparador que usted proporciona como un argumento, o por lo menos todos los elementos que son "menos que" la clave debe venir antes de ese elemento en la matriz y todos los elementos que son "mayores que" la clave deben venir después de ese elemento en la matriz;

  2. La prueba que normalmente hace con indexOf para determinar si una clave está en la matriz (verifique si el valor devuelto no es -1) no se cumple con binarySearch. Debe verificar que el valor de retorno no sea inferior a cero, ya que el valor devuelto indicará que la clave no está presente, pero el índice en el que se esperaría si existiera;

  3. Si su matriz contiene múltiples elementos que son iguales a la clave, lo que obtiene de binarySearch no está definido; esto es diferente de indexOf que devolverá la primera ocurrencia y lastIndexOf que devolverá la última ocurrencia.

  4. Puede parecer que una matriz de booleanos está ordenada si contiene primero todos los falsos y luego todos los trucos, pero esto no cuenta. No hay anulación del método binarySearch que acepta una matriz de booleanos y tendrá que hacer algo inteligente allí si desea el rendimiento O (log n) al detectar dónde aparece la primera verdad en una matriz, por ejemplo, usando una matriz de Booleanos y las constantes Boolean.FALSE y Boolean.TRUE.

Si la matriz no está ordenada y no primitivo tipo, puede utilizar los métodos indexOf y lastIndexOf de la Lista invocando el método de java.util.Arrays asList. Este método devolverá un contenedor de interfaz AbstractList alrededor de su matriz. Implica una sobrecarga mínima ya que no crea una copia de la matriz. Como se mencionó, este método no está sobrecargado, por lo que esto solo funcionará en matrices de tipos de referencia.

Si la matriz no está ordenada y el tipo de la matriz es primitiva, usted está fuera de suerte con la API de Java. Escriba su propio ciclo for, o su propio método de utilidad estática, que sin duda tendrá ventajas de rendimiento sobre el enfoque asList que implica una sobrecarga de una instanciación de objetos. En caso de que le preocupe que escribir una fuerza bruta para el ciclo que itere sobre todos los elementos de la matriz no sea una solución elegante, acepte que eso es exactamente lo que está haciendo la API de Java cuando llama a indexOf. Usted puede hacer algo como esto:

public static int indexOfIntArray(int[] array, int key) { 
    int returnvalue = -1; 
    for (int i = 0; i < array.length; ++i) { 
     if (key == array[i]) { 
      returnvalue = i; 
      break; 
     } 
    } 
    return returnvalue; 
} 

Si se quiere evitar la escritura de su propio método aquí, considerar el uso de uno de un marco de desarrollo como la guayaba. Allí puede encontrar una implementación de indexOf y lastIndexOf.

2

No hay una función indexOf directa en las matrices de Java.

-2

Puede clasificar en primer lugar la matriz usando:

Arrays.sort(Your_Array_Name); 

y luego usar la búsqueda binaria para encontrar el índice (supongamos que es 'c')

result = Arrays.binarySearch(Your_Array_Name, c); 

ahora la variable resultante contendrá el índice del caracter 'c'.

+0

-1: Primero, esto muta la matriz original que se va a ordenar, que no queremos. En segundo lugar da la respuesta a la matriz ordenada, no a la matriz original, que es lo que queremos (si quisiéramos la respuesta ordenada por wrt, ya estaría ordenada). En tercer lugar, dado que la ordenación es O (n log n), esto es más lento que simplemente atravesar el conjunto de forma lineal. Entonces esta respuesta es incorrecta e ineficiente. – Jamie