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.
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.
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.
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;
}
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
Vous pouvez le convertir en liste, puis utiliser la méthode indexOf:
Array.asList(array).indexOf(1);
http://download.Oracle.com/javase/1.5.0/docs/api/Java/util/Arrays.html#asList(T ...) http: // download. Oracle.com/javase/1.5.0/docs/api/Java/util/List.html#indexOf(Java.lang.Object )
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?
Simple:
public int getArrayIndex(int[] arr,int value) {
for(int i=0;i<arr.length;i++)
if(arr[i]==value) return i;
return -1;
}
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();
}
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()
.
Integer[] arr = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };
List<Integer> arrlst = Arrays.asList(arr);
System.out.println(arrlst.lastIndexOf(1));
/**
* 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;
}
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 :)
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.
Au cas où quelqu'un chercherait toujours la réponse
Vous pouvez utiliser ArrayUtils.indexOf () à partir de [Apache Commons Library] [1].
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);
}
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;
}