Comment trouver l'indice d'un élément dans un tableau en Java?

je cherche à trouver L'index D'un élément donné, connaissant son contenu, en Java.

j'ai essayé l'exemple suivant, qui ne fonctionne pas:

class masi { 
    public static void main( String[] args ) { 
        char[] list = {'m', 'e', 'y'};

        // should print 1
        System.out.println(list[] == "e");                    
    } 
}

est-ce que quelqu'un peut expliquer ce qui ne va pas avec ceci et ce que je dois faire pour le réparer?

39
demandé sur Bart Kiers 2009-10-06 00:05:46

14 réponses

dans ce cas, vous pouvez créer une nouvelle chaîne à partir de votre tableau de caractères et ensuite faire un indéoxof ("e") sur cette chaîne:

System.out.println(new String(list).indexOf("e")); 

mais dans d'autres cas de types de données primitifs, vous devrez itérer dessus.

43
répondu Bart Kiers 2009-10-05 20:07:42

ce n'est même pas une syntaxe valide. et vous essayez de comparer à une chaîne. Pour les tableaux, vous devez parcourir le tableau vous-même:

public class T {
  public static void main( String args[] ) {
    char[] list = {'m', 'e', 'y'};

    int index = -1;

    for (int i = 0; (i < list.length) && (index == -1); i++) {
        if (list[i] == 'e') {
            index = i;
        }
    }

    System.out.println(index);
  }
}

si vous utilisez une collection, telle que ArrayList<Character> , vous pouvez également utiliser la méthode indexOf() :

ArrayList<Character> list = new ArrayList<Character>();
list.add('m');
list.add('e');
list.add('y');

System.out.println(list.indexOf('e'));

il y a aussi la classe Arrays qui raccourcit le code ci-dessus:

List list = Arrays.asList(new Character[] { 'm', 'e', 'y' });
System.out.println(list.indexOf('e'));
17
répondu Joey 2009-10-05 20:16:02

alternativement, vous pouvez utiliser Commons Lang ArrayUtils class:

int[] arr = new int{3, 5, 1, 4, 2};
int indexOfTwo = ArrayUtils.indexOf(arr, 2);

il existe des variantes surchargées de la méthode indexOf() pour différents types de réseaux.

13
répondu Max77 2014-06-19 18:24:50

Pour des primitifs tableaux

à partir de Java 8, la solution générale pour un tableau primitif arr , et une valeur pour rechercher val , est:

public static int indexOf(char[] arr, char val) {
    return IntStream.range(0, arr.length).filter(i -> arr[i] == val).findFirst().orElse(-1);
}

ce code crée un flux au-dessus des index du tableau avec IntStream.range , filtre les index pour ne conserver que ceux où l'élément du tableau à cet index est égal à la valeur recherchée et conserve finalement la première correspondait à findFirst . findFirst renvoie un OptionalInt , comme il est possible qu'aucun index correspondant n'ait été trouvé. Nous invoquons donc orElse(-1) pour retourner la valeur trouvée ou -1 si aucune n'a été trouvée.

Les surcharges

peuvent être ajoutées pour int[] , long[] , etc. Le corps de la méthode reste la même.

Pour Objet tableaux

pour les tableaux d'objets, comme String[] , nous pourrions utiliser la même idée et avoir l'étape de filtrage en utilisant le equals méthode, ou Objects.equals pour considérer deux null éléments égaux, au lieu de == .

mais nous pouvons le faire d'une manière plus simple avec:

public static <T> int indexOf(T[] arr, T val) {
    return Arrays.asList(arr).indexOf(val);
}

cela crée un enveloppeur de liste pour l'entrée tableau utilisant Arrays.asList et recherche l'index de l'élément avec indexOf .

Cette solution ne fonctionne pas pour les tableaux primitifs, comme montré ici : un tableau primitif comme int[] n'est pas un Object[] mais un Object ; en tant que tel, en invoquant asList sur elle crée une liste d'un seul élément, qui est le tableau donné, pas une liste des éléments du tableau.

8
répondu Tunaki 2017-05-23 11:54:34

je crois que le seulement la façon la plus saine de faire ceci est d'itérer manuellement à travers le tableau.

for (int i = 0; i < list.length; i++) {
  if (list[i] == 'e') {
    System.out.println(i);
    break;
  }
}
7
répondu Matt Solnit 2009-10-05 21:07:49

le problème avec votre code est que lorsque vous faites""

 list[] == "e"

vous vous demandez si l'objet array (pas le contenu) est égal à la chaîne "e", ce qui n'est clairement pas le cas.

vous voudrez itérer sur le contenu afin de faire le contrôle que vous voulez:

 for(String element : list) {
      if (element.equals("e")) {
           // do something here
      }
 }
4
répondu Peter 2009-10-05 20:10:01

maintenant il ne imprimer 1

class Masi {
    public static void main( String [] args ) {
         char [] list = { 'm', 'e', 'y' };

         // Prints 1
         System.out.println( indexOf( 'e', list ) );
    }

    private static int indexOf( char c , char [] arr ) {
        for( int i = 0 ; i < arr.length ; i++ ) {
            if( arr[i] == c ) { 
                return i;
            }
         }
         return -1;
     }
 }

gardez à l'esprit que

"e"

est un objet string littéral ( qui représente un objet string qui est)

alors que

'e'

est un caractère littéral (qui représente un type de données primitif)

Même quand

list[]

serait valide Java ( qui n'est pas ) comparer l'élément de caractère a avec un élément de chaîne de caractères retournerait false de toute façon.

utilisez simplement cette fonction d'indexOf string et vous pourriez trouver n'importe quel caractère dans n'importe quel alphabet ( ou tableau de caractères )

2
répondu OscarRyz 2009-10-05 23:35:26

Très Fortement Édité. Je pense que soit vous voulez ceci:

class CharStorage {
    /** set offset to 1 if you want b=1, o=2, y=3 instead of b=0... */
    private final int offset=0;
    private int array[]=new int[26];

    /** Call this with up to 26 characters to initialize the array.  For 
      * instance, if you pass "boy" it will init to b=0,o=1,y=2.
      */
    void init(String s) {
        for(int i=0;i<s.length;i++)
            store(s.charAt(i)-'a' + offset,i); 
    }

    void store(char ch, int value) {
        if(ch < 'a' || ch > 'z') throw new IllegalArgumentException();
        array[ch-'a']=value;
    }

    int get(char ch) {
        if(ch < 'a' || ch > 'z') throw new IllegalArgumentException();
        return array[ch-'a'];
    }
}

(notez que vous pourriez devoir ajuster la méthode init si vous voulez utiliser 1-26 au lieu de 0-25)

ou vous voulez:

int getLetterPossitionInAlphabet(char c) {
    return c - 'a' + 1
}

le second est si vous voulez toujours a=1, z=26. Le premier vous permettra de mettre dans une chaîne de caractères comme "qwerty" et assigner q=0, w=1, e=2, r=3...

1
répondu Bill K 2009-10-05 23:30:32

cette façon devrait fonctionner, changer "char" en "caractère":

public static void main(String[] args){
  Character[] list = {'m', 'e', 'y'};
  System.out.println(Arrays.asList(list).indexOf('e')); // print "1"
}
1
répondu Kehe CAI 2016-04-02 12:48:56

solution la plus simple :

convertissez le tableau en liste et vous pouvez obtenir la position d'un élément.

List<String> abcd  = Arrays.asList(yourArray);
int i = abcd.indexOf("abcd");

autre solution , vous pouvez iterator array:

int position = 0;
for (String obj : yourArray) {
    if (obj.equals("abcd") {
    return position;
    }
    position += 1;
} 

//OR
for (int i = 0; i < yourArray.length; i++) {
    if (obj.equals("abcd") {
       return i;
    }
}
1
répondu MeosCoder 2018-04-08 16:14:13

voici un autre exemple, et comment indexOf .

public int indexOf(Object target) {
    for (int i = 0; i < array.length; i++) {
        if (equals(target, array[i])) {
            return i;
        }
    }
    return -1;
}
1
répondu Salvador Vigo 2018-04-17 16:40:36

Si l'ordre des éléments n'est pas vraiment important, vous pouvez trier le tableau, puis binarySearch:

import java.util.Arrays;

class masi { 
    public static void main( String[] args ) { 
        char[] list = {'m', 'e', 'y'};
        Arrays.sort(list);

        // should print 0, as e is now sorted to the beginning
        // returns negative number if the result isn't found
        System.out.println( Arrays.binarySearch(list, 'e') );
    } 
}
0
répondu Powerlord 2009-10-05 21:22:06

je suis en fournissant la bonne méthode pour ce faire un

/**
     * 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
répondu Manmohan Soni 2013-07-03 05:28:33

de Cette façon, vous pouvez utiliser jusqu'à 'N' lettres.

char[] a={ 'a', 'b', 'c', 'd', 'e' };
int indexOf=0;
for(int i=0;i<a.length;i++){
  if(a[i] != 'b'){
    indexOf++;
    }else{
    System.out.println("index of given: "+indexOf);
 }}
-1
répondu Roshini 2018-04-29 04:21:12