Debo estar perdiendo algo muy obvio, pero he buscado por todas partes y no puedo encontrar este método.
198
Hay un par de formas de lograr esto usando la Arrays
clase de utilidad.
Si la matriz no está ordenada y no es una matriz de primitivas:
java.util.Arrays.asList(theArray).indexOf(o)
Si la matriz es primitiva y no está ordenada, se debe usar una solución ofrecida por una de las otras respuestas, como la de Kerem Baydogan , Andrew McKinlay o Mishax . El código anterior se compilará incluso si theArray
es primitivo (posiblemente emitiendo una advertencia) pero de todos modos obtendrá resultados totalmente incorrectos.
Si la matriz está ordenada, puede hacer uso de una búsqueda binaria de rendimiento:
java.util.Arrays.binarySearch(theArray, o)
T...
, el tipo de argumento en tiempo de ejecución real esT[]
, y pasar cero o más parámetros de tipoT
hace que se envuelvan en una matriz recién construida y se pasen. Si el parámetro que se pasa ya es de tipoT[]
, se omite el azúcar sintáctico..indexOf
embargo, la solución ( ) no es válida para primitivas.Arrays.toList(list).sublist(from,to).indexOf(o)
para buscar un elemento dentro del rango[from, to)
.La matriz no tiene
indexOf()
método.Tal vez este
ArrayUtils
método Lang de Apache Commons es lo que estás buscandofuente
Para las primitivas, si desea evitar el boxeo, Guava tiene ayudantes para matrices primitivas, por ejemplo, Ints.indexOf (int [] array, int target)
fuente
No hay ninguno. Utilice un
java.util.List
* o puede escribir el suyo propioindexOf()
:* puedes hacer uno de tu matriz usando
Arrays#asList()
fuente
T
es engañoso. No proporciona ningún tipo de seguridad, es fácil de confundir, es de tipo seguro ... mejor uso ObjetoindexOf("str", new Object[] {});
,indexOf(new Object(), new String[] {});
indexOf("str", new Date[] {})
,indexOf(new Date(), new String[] {})
A diferencia de C # donde tiene el método Array.IndexOf , y JavaScript donde tiene el método indexOf , la API de Java (la
Array
yArrays
clases 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 ), este último es lo que puede esperar de una búsqueda secuencial realizada por indexOf). Hay cuatro consideraciones:
La matriz se debe ordenar en orden natural o en el orden de un comparador que proporcione como argumento, o al menos todos los elementos que son "menores que" la clave debe 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;
La prueba que normalmente realiza con indexOf para determinar si una clave está en la matriz (verificar si el valor de retorno no es -1) no se cumple con binarySearch. Debe verificar que el valor de retorno no sea menor que cero, ya que el valor devuelto indicará que la clave no está presente, pero el índice en el que se esperaría si existiera;
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 aparición y lastIndexOf que devolverá la última aparición.
Una matriz de booleanos puede parecer ordenada si primero contiene todos los falsos y luego todas las verdades, 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 un rendimiento O (log n) al detectar dónde aparece la primera verdad en una matriz, por ejemplo, utilizando 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 asList método 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 solo funcionará en matrices de tipos de referencia.
Si su matriz no está ordenada y el tipo de matriz es primitiva , no tiene suerte con la API de Java. Escriba su propio bucle for, o su propio método de utilidad estática, que sin duda tendrá ventajas de rendimiento sobre el enfoque asList que implica cierta sobrecarga de una instanciación de objeto. En caso de que le preocupe que escribir una fuerza bruta para el bucle que itera sobre todos los elementos de la matriz no sea una solución elegante, acepte que eso es exactamente lo que hace la API de Java cuando llama a indexOf. Puedes hacer algo como esto:
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 .
fuente
Java
ArrayList
tiene unindexOf
método. Las matrices Java no tienen tal método.fuente
ArrayList
, cada JavaList
tieneindexOf()
.No recuerdo un "indexOf" en matrices que no sea codificarlo usted mismo ... aunque probablemente podría usar uno de los muchos
java.util.Arrays#binarySearch(...)
métodos (consulte el javadoc de matrices ) si su matriz contiene tipos primitivosfuente
La interfaz de 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 tal método. Tiene un método binarySearch () para matrices ordenadas.
fuente
Las matrices mismas no tienen ese método. Una lista, sin embargo, sí: indexOf
fuente
ArrayList
, cada JavaList
tieneindexOf()
.Probablemente esté pensando en java.util.ArrayList , no en la matriz.
fuente
No hay una función indexOf directa en las matrices java.
fuente
La respuesta de Jeffrey Hantin es buena, pero tiene algunas limitaciones, si es esto lo que hace o no a eso ...
Puede escribir su propio método de extensión y siempre funciona de la manera que desee.
Y aquí está tu extensión
fuente
Nota: puede usar este método para matrices de tipo int, también puede usar este algoritmo para otros tipos con cambios menores
fuente