web-dev-qa-db-fra.com

Comment trouver l'index d'un élément dans un tableau int?

Comment trouver un index d'une certaine valeur dans un tableau Java de type int?

J'ai essayé d'utiliser Arrays.binarySearch sur mon tableau non trié, cela ne donne parfois que la bonne réponse.

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

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

Notez que cette solution est threadsafe car elle crée un nouvel objet de type List. 

Aussi, vous ne voulez pas invoquer ceci dans une boucle ou quelque chose comme ça, car vous créeriez un nouvel objet à chaque fois.

116
Pablo Fernandez

Une autre option si vous utilisez Guava Collections est 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);

C'est un excellent choix lorsque la réutilisation d'espace, de temps et de code est primordiale. C'est aussi très laconique.

24
btiernay

Un coup d'oeil au API et il est écrit que vous devez d'abord trier le tableau 

Alors:

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

Si vous ne voulez pas trier le tableau:

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

Copiez cette méthode dans votre classe 

 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;
}

Appelez cette méthode en passant deux paramètres, tableau et valeur, puis stockez sa valeur de retour dans une variable entière.

int indexNum = getArrayIndex(array,value);

Je vous remercie

11
Dalvinder Singh
3
agmcleod

Vous devez trier les valeurs avant d'utiliser la recherche binaire. Sinon, la méthode manuelle consiste à essayer tous les éléments de votre onglet.

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

  return -1;
}//met

Une autre méthode pourrait consister à mapper tous les index pour chaque valeur d'une carte. 

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

puis map.get (valeur) pour obtenir l'index.

Cordialement, .__ Stéphane

@pst, merci pour vos commentaires. Pouvez-vous poster une autre méthode alternative?

3
Snicolas

Simple:

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

Vous pouvez utiliser Java moderne pour résoudre ce problème. Veuillez utiliser le code ci-dessous:

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

Vous pouvez parcourir le tableau jusqu'à ce que vous trouviez l'index que vous recherchez ou utiliser plutôt une variable List. Notez que vous pouvez transformer le tableau en une liste avec asList() .

0
rid
    Integer[] arr = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };
    List<Integer> arrlst = Arrays.asList(arr);
    System.out.println(arrlst.lastIndexOf(1));
0
alok
/**
     * 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;
    }
0
Manmohan Soni

Vous pouvez le faire comme ça:

 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;

}

}

Ajout d'un XOR :)

0
Andre

Dans la méthode principale utilisant les boucles for: - la troisième boucle dans mon exemple correspond à la réponse à cette question. arrêté la boucle lorsque l'emplacement du tableau a atteint la plus petite valeur tout en comptant le nombre de boucles.

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);
    }
}

Code affiche tous les numéros et leurs emplacements, ainsi que l’emplacement du plus petit nombre suivi du plus petit nombre.

0
extremeoats

Au cas où quelqu'un chercherait toujours la réponse

  1. Vous pouvez utiliser ArrayUtils.indexOf () à partir de [Apache Commons Library] [1].

  2. Si vous utilisez Java 8, vous pouvez également utiliser l'API 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 # index_f

0
Deep Shah
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
Rahul9191