¿Dónde está Java’s Array indexOf?

Debo extrañar algo muy obvio, pero he buscado por todas partes y no puedo encontrar este método.

Hay algunas maneras de lograr esto usando la clase de utilidad Arrays .

Si la matriz no está ordenada:

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

Si la matriz está ordenada, puede hacer uso de una búsqueda binaria para el rendimiento:

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

Array no tiene el método indexOf() .

Tal vez este método Apache Commons Lang ArrayUtils es lo que estás buscando

 import org.apache.commons.lang3.ArrayUtils; String[] colours = { "Red", "Orange", "Yellow", "Green" }; int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow"); 

No hay ninguno. Utilice un java.util.List *, o puede escribir su propio indexOf() :

 public static  int indexOf(T needle, T[] haystack) { for (int i=0; i 

* puede hacer uno desde su matriz usando Arrays#asList()

Para primitivos, si desea evitar el boxeo, Guava tiene ayudantes para matrices primitivas, por ejemplo, Ints.indexOf (int [] array, int target)

A diferencia de C # donde tienes el método Array.IndexOf , y JavaScript donde tienes el método indexOf , la API de Java (las clases Array y Array en particular) no tienen dicho 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 su matriz está ordenada , tiene suerte porque la clase Arrays define una serie de sobrecargas del método binarySearch que encontrará el índice del elemento que está buscando con el mejor rendimiento posible (O (log n) en lugar de O (n) ), siendo este último lo que puede esperar de una búsqueda secuencial realizada por indexOf). Hay cuatro consideraciones:

  1. La matriz debe ordenarse en orden natural o en el orden de un Comparador que proporcione como argumento o, como mínimo, todos los elementos que sean “inferiores a” deben aparecer antes de ese elemento en la matriz y todos los elementos que son “mayores que” la clave debe 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 obtienes 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 todos los falsos primero 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 su matriz no está ordenada y no es de tipo primitivo , puede usar los métodos indexOf y lastIndexOf de List invocando el método asList de java.util.Arrays. 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 su matriz no está ordenada y el tipo de matriz es primitivo , no tiene 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. Puedes 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 desea evitar escribir su propio método aquí, considere usar uno de un marco de desarrollo como Guava. Allí puede encontrar una implementación de indexOf y lastIndexOf .

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

No recuerdo un “indexOf” en arreglos que no sean códigos para usted … aunque probablemente podría usar uno de los muchos java.util.Arrays#binarySearch(...) (vea los Arrays javadoc ) si su matriz contiene tipos primitivos

La interfaz List 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.

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

Probablemente estés pensando en java.util.ArrayList , no en la matriz.

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

Primero puede ordenar la matriz usando:

 Arrays.sort(Your_Array_Name); 

y luego usa la búsqueda binaria para encontrar el índice (supongamos que es ‘c’)

 result = Arrays.binarySearch(Your_Array_Name, c); 

ahora la variable de resultado contendrá el índice del carácter ‘c’.