in

¿Dónde está el Array indexOf de Java?

apple touch icon@2

A diferencia de C # donde tienes el Array.IndexOf método y JavaScript donde tienes el índice de método, API de Java (el Array y Arrays clases en particular) no tienen tal método.

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

Si su matriz está ordenada, estás de suerte porque la clase Arrays define una serie de sobrecargas del método binarySearch que encontrará el índice del elemento que estás 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 al menos todos los elementos que son «menores que» la clave deben ir antes de ese elemento en la matriz y todos los elementos que son «mayores que» la clave debe ir 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 de retorno no es -1) no se sostiene con binarySearch. Debe verificar que el valor devuelto 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;

  3. Si su matriz contiene varios 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.

  4. Una matriz de valores booleanos puede parecer ordenada si primero contiene todos los falsos y luego todos los verdaderos, pero esto no cuenta. No hay anulación del método binarySearch que acepta una matriz de valores booleanos y tendrá que hacer algo inteligente allí si desea un rendimiento de O (log n) al detectar dónde aparece el primer verdadero 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 utilizar los métodos indexOf y lastIndexOf de List invocando el 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 primitivo, 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 instanciación de un objeto. En caso de que le preocupe que escribir un bucle for de fuerza bruta que itera 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 índice de y lastIndexOf.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

basic block diagram

Sistemas de control: diagramas de bloques

gfg 200x200 min

SQL | Declaración DESCRIBE – GeeksforGeeks