¿Cómo encontrar el índice de un elemento en una matriz int?


81

¿Cómo puedo encontrar un índice de cierto valor en una matriz de tipo Java int?

Intenté usar Arrays.binarySearch en mi matriz sin clasificar, solo a veces da la respuesta correcta.


12
La búsqueda binaria nunca funcionará en una matriz sin clasificar.
Chris Eberle

Entonces, ¿puedes sugerirme algo? ¿Cómo debo hacerlo? Porque si ordeno la matriz, pierdo la pista de los índices y necesito saber de qué índice proviene el valor.
Jeomark

EDITAR: Olvidé agregar, también necesito encontrar el índice de matriz para valores dobles.
Jeomark

1
Si no desea ordenar la matriz, simplemente use un bucle for simple para encontrar el valor.
Jamie Curtis

2
Generalmente es bueno leer la documentación de las funciones :) De binarySearch: "Busca en la matriz especificada de ... el valor especificado usando el algoritmo de búsqueda binaria. La matriz debe ser ordenada (como por el método sort (long [])) antes para realizar esta llamada. Si no está ordenada, los resultados no están definidos. ... "

Respuestas:


133
Integer[] array = {1,2,3,4,5,6};

Arrays.asList(array).indexOf(4);

Tenga en cuenta que esta solución es segura para subprocesos porque crea un nuevo objeto de tipo Lista.

Además, no desea invocar esto en un bucle o algo así, ya que estaría creando un nuevo objeto cada vez


Gracias, pero ¿funcionaría para el tipo doble? Lo siento, olvidé mencionar en la pregunta, pero también necesito trabajar esto para valores dobles. Sin embargo, funciona bien con ints.
Jeomark

Sí, no tiene que cambiar nada (pero el tipo de matriz obviamente)
Pablo Fernandez

54
En realidad, el código no funciona. Compruebe ¿Por qué indexOf no encuentra el objeto?
teloon

14
Necesita convertir la matriz a Integer [] en lugar de int []. las matrices primitivas no se encuadran automáticamente.
Leon Helmsley

1
¿Es esto realmente seguro para subprocesos? Cuando hago clic en la fuente, List.asList () crea una ArrayList que toma la matriz int directamente como contenedor de datos (no copia)
Langusten Gustel

26

Otra opción si está utilizando Guava Collections es Ints.indexOf

// Perfect storm:
final int needle = 42;
final int[] haystack = [1, 2, 3, 42];

// Spoiler alert: index == 3
final int index = Ints.indexOf(haystack, needle);

Esta es una gran opción cuando el espacio, el tiempo y la reutilización de código son un bien escaso. También es muy escueto.


20

Una mirada a la API y dice que primero debes ordenar la matriz

Entonces:

Arrays.sort(array);
Arrays.binarySearch(array, value);

Si no desea ordenar la matriz:

public int find(double[] array, double value) {
    for(int i=0; i<array.length; i++) 
         if(array[i] == value)
             return i;
}

7
+1 Sin embargo, debe tenerse en cuenta que Arrays.sort muta la entrada y se modificará la matriz original.

gracias, el segundo método de alguna manera me funcionó después de agregar algo de lógica para valores duplicados con diferentes índices.
Jeomark

14

Copia este método en tu clase

 public int getArrayIndex(int[] arr,int value) {

        int k=0;
        for(int i=0;i<arr.length;i++){

            if(arr[i]==value){
                k=i;
                break;
            }
        }
    return k;
}

Llame a este método con pasar dos parámetros Array y value y almacene su valor de retorno en una variable entera.

int indexNum = getArrayIndex(array,value);

Gracias


6
ArrayUtils.indexOf(array, value);
Ints.indexOf(array, value);
Arrays.asList(array).indexOf(value);

3
Si bien este código puede resolver la pregunta, incluir una explicación de cómo y por qué esto resuelve el problema realmente ayudaría a mejorar la calidad de su publicación y probablemente resultaría en más votos a favor. Recuerde que está respondiendo la pregunta a los lectores en el futuro, no solo a la persona que pregunta ahora. Por favor, editar su respuesta para agregar explicaciones y dar una indicación de lo que se aplican limitaciones y supuestos.
doble pitido

4

Puede usar Java moderno para resolver este problema. Utilice el siguiente código:

static int findIndexOf(int V, int[] arr) {
        return IntStream.range(1, arr.length).filter(i->arr[i]==V).findFirst().getAsInt();
    }

¡Excelente! Gracias por compartir. Ayuda a aprender sobre las nuevas soluciones integradas (optimizadas) dentro del contexto de las capacidades del lenguaje.
Guillermo García


3

Debe ordenar los valores antes de utilizar la búsqueda binaria. De lo contrario, la forma manual es probar todas las entradas en su pestaña.

public int getIndexOf( int toSearch, int[] tab )
{
  for( int i=0; i< tab.length ; i ++ )
    if( tab[ i ] == toSearch)
     return i;

  return -1;
}//met

Un método alternativo podría ser mapear todos los índices para cada valor en un mapa.

tab[ index ] = value;
if( map.get( value) == null || map.get( value) > index )
    map.put( value, index );

y luego map.get (valor) para obtener el índice.

Saludos, Stéphane

@pst, gracias por tus comentarios. ¿Puedes publicar otro método alternativo?


Ésta es una forma, sí. Sin embargo, es no la única manera. El uso de la variable booleana foundaquí es inútil (y no se usa) y debe eliminarse. Sin embargo, un +1 para mostrar "el método de bucle manual" (dejando de lado los problemas de estilo y formato).

2

Simple:

public int getArrayIndex(int[] arr,int value) {
    for(int i=0;i<arr.length;i++)
        if(arr[i]==value) return i;
    return -1;
}

2
    Integer[] arr = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };
    List<Integer> arrlst = Arrays.asList(arr);
    System.out.println(arrlst.lastIndexOf(1));

Tenga en cuenta que la matriz debe ser Integer [], no int []. Al menos, indexOf () funciona solo con Integer
djdance

1

En caso de que alguien todavía esté buscando la respuesta-

  1. Puede utilizar ArrayUtils.indexOf () de la [Apache Commons Library] [1].

  2. Si está utilizando Java 8, también puede utilizar la API de Strean:

    public static int indexOf(int[] array, int valueToFind) {
        if (array == null) {
            return -1;
        }
        return IntStream.range(0, array.length)
                .filter(i -> valueToFind == array[i])
                .findFirst()
                .orElse(-1);
    }
    

    [1]: https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/ArrayUtils.html#indexOf(int[],%20int)


1

La forma más sencilla es iterar. Por ejemplo, queremos encontrar el valor mínimo de la matriz y su índice:

public static Pair<Integer, Integer> getMinimumAndIndex(int[] array) {
        int min = array[0];
        int index = 0;
        for (int i = 1; i < array.length; i++) {
            if (array[i] < min) {
                min = array[i];
                index = i;
            }

            return new Pair<min, index>;

De esta manera, prueba todos los valores de la matriz y, si algunos de ellos son mínimos, también conoce el índice de mínimos. Puede funcionar igual con la búsqueda de algún valor:

public static int indexOfNumber(int[] array) {
        int index = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[i] == 77) {        // here you pass some value for example 77
                index = i;
            }
        }
        return index;
    }

0

Puede recorrer la matriz hasta encontrar el índice que está buscando o usar un List. Tenga en cuenta que puede transformar la matriz en una lista con asList().


0
/**
     * Method to get the index of the given item from the list
     * @param stringArray
     * @param name
     * @return index of the item if item exists else return -1
     */
    public static int getIndexOfItemInArray(String[] stringArray, String name) {
        if (stringArray != null && stringArray.length > 0) {
            ArrayList<String> list = new ArrayList<String>(Arrays.asList(stringArray));
            int index = list.indexOf(name);
            list.clear();
            return index;
        }
        return -1;
    }

El cleary el new ArrayListson operaciones innecesarias. La asignación de una nueva ArrayListcopia toda la matriz, lo cual no tiene sentido, porque Arrays.asListya devuelve un Listque tiene un indexOfmétodo. No es necesario borrar la copia de la lista, GC la eliminará de todos modos.
TWiStErRob

0

Puedes hacerlo así:

 public class Test {

public static int Tab[]  = {33,44,55,66,7,88,44,11,23,45,32,12,95};
public static int search = 23;

public static void main(String[] args) {
    long stop = 0;
    long time = 0;
    long start = 0;
    start = System.nanoTime();
    int index = getIndexOf(search,Tab);
    stop = System.nanoTime();
    time = stop - start;
    System.out.println("equal to took in nano seconds ="+time);
    System.out.println("Index  of searched value is: "+index);
    System.out.println("De value of Tab with searched index is: "+Tab[index]);
    System.out.println("==========================================================");
    start = System.nanoTime();
    int Bindex = bitSearch(search,Tab);
    stop = System.nanoTime();
    time = stop - start;
    System.out.println("Binary search took nano seconds ="+time);
    System.out.println("Index  of searched value is: "+Bindex);
    System.out.println("De value of Tab with searched index is: "+Tab[Bindex]);
}



public static int getIndexOf( int toSearch, int[] tab ){
     int i = 0;
     while(!(tab[i] == toSearch) )
     {  i++; }
       return i; // or return tab[i];
   }
public static int bitSearch(int toSearch, int[] tab){
    int i = 0;
    for(;(toSearch^tab[i])!=0;i++){
    }
    return i;

}

}

Se agregó un XOR :)


tab.equals(toSearch)está comparando una matriz con un int. Quizás en su tab[i] == toSearchlugar.
Mike Samuel

Esto funciona gracias Mike ... Google por la búsqueda binaria, hay algunos artículos interesantes y es un método interesante
Andre

@Andre si usted está tratando de demostrar un punto de darles la igualdad de condiciones (mismo orden, el mismo flujo de control): while (tab[i] != toSearch) i++;VS while ((tab[i] ^ toSearch) != 0) i++;.
TWiStErRob

1
En cualquier caso, esta forma de cronometraje no funciona, para mí bitSearchsiempre es más rápido que getIndexOf; mientras que si simplemente cambio las llamadas a los dos métodos se getIndexOfvuelve más rápido que bitSearch. Esto demuestra claramente que el segundo siempre es más rápido por alguna razón interna de JVM. Debería estar repitiendo el experimento muchas veces (probablemente millones), promediando los valores, descartando los valores extremos y haciendo un calentamiento que es muy similar a la prueba.
TWiStErRob

0

En el método principal que usa bucles for: -el tercer bucle for en mi ejemplo es la respuesta a esta pregunta. -en mi ejemplo hice una matriz de 20 enteros aleatorios, asigné a una variable el número más pequeño y detuve el ciclo cuando la ubicación de la matriz alcanzó el valor más pequeño mientras contaba el número de ciclos.

import java.util.Random;
public class scratch {
    public static void main(String[] args){
        Random rnd = new Random();
        int randomIntegers[] = new int[20];
        double smallest = randomIntegers[0];
        int location = 0;

        for(int i = 0; i < randomIntegers.length; i++){             // fills array with random integers
            randomIntegers[i] = rnd.nextInt(99) + 1;
            System.out.println(" --" + i + "-- " + randomIntegers[i]);
        }

        for (int i = 0; i < randomIntegers.length; i++){            // get the location of smallest number in the array 
            if(randomIntegers[i] < smallest){
                smallest = randomIntegers[i];                 
            }
        }

        for (int i = 0; i < randomIntegers.length; i++){                
            if(randomIntegers[i] == smallest){                      //break the loop when array location value == <smallest>
                break;
            }
            location ++;
        }
        System.out.println("location: " + location + "\nsmallest: " + smallest);
    }
}

El código genera todos los números y sus ubicaciones, y la ubicación del número más pequeño seguido del número más pequeño.


0
static int[] getIndex(int[] data, int number) {
    int[] positions = new int[data.length];
    if (data.length > 0) {
        int counter = 0;
        for(int i =0; i < data.length; i++) {
            if(data[i] == number){
                positions[counter] = i;
                counter++;
            }
        }
    }
    return positions;
}

0

Búsqueda binaria: la búsqueda binaria también se puede utilizar para encontrar el índice del elemento de la matriz en una matriz. Pero la búsqueda binaria solo se puede usar si la matriz está ordenada. Java nos proporciona una función incorporada que se puede encontrar en la biblioteca Arrays de Java que devolverá el índice si el elemento está presente, de lo contrario, devuelve -1. La complejidad será O (log n). A continuación se muestra la implementación de la búsqueda binaria.

public static int findIndex(int arr[], int t) { 
   int index = Arrays.binarySearch(arr, t); 
   return (index < 0) ? -1 : index; 
} 

-2
Integer[] array = {1, 2, 3, 4, 5, 6};

for (int i = 0; i < array.length; i++) {
    if (array[i] == 4) {
        system.out.println(i);
        break;
    }
}

3
Respuesta duplicada.
betontalpfa
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.