Подтвердить что ты не робот

Как найти индекс элемента в массиве в Java?

Я ищу, чтобы найти индекс данного элемента, зная его содержимое, в Java.

Я попробовал следующий пример, который не работает:

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

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

Может кто-нибудь объяснить, что не так с этим и что мне нужно сделать, чтобы исправить это?

4b9b3361

Ответ 1

В этом случае вы можете создать новую строку String из своего массива символов, а затем сделать indeoxOf ( "e" ) в этой строке:

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

Но в других случаях примитивных типов данных вам придется перебирать его.

Ответ 2

Это даже не действительный синтаксис. И вы пытаетесь сравнить со строкой. Для массивов вам придется самостоятельно пройти массив:

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

Если вы используете коллекцию, например ArrayList<Character>, вы также можете использовать метод indexOf():

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

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

Существует также класс Arrays, который сокращает код выше:

List list = Arrays.asList(new Character[] { 'm', 'e', 'y' });
System.out.println(list.indexOf('e'));

Ответ 3

Я считаю, что самый лучший способ - это вручную перебирать массив.

for (int i = 0; i < list.length; i++) {
  if (list[i] == 'e') {
    System.out.println(i);
    break;
  }
}

Ответ 4

В качестве альтернативы вы можете использовать Commons Lang ArrayUtils класс:

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

Существуют перегруженные варианты метода indexOf() для разных типов массивов.

Ответ 5

Для примитивных массивов

Начиная с Java 8, решение общего назначения для примитивного массива arr и значение для поиска val:

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

Этот код создает поток по индексам массива с IntStream.range, фильтрует индексы, чтобы сохранить только те, где элемент массива в этом индексе равен искомому значению, и, наконец, сохраняет первый, сопоставляемый с findFirst. findFirst возвращает OptionalInt, так как возможно, что совпадающие индексы не найдены. Поэтому мы вызываем orElse(-1), чтобы либо вернуть найденное значение, либо -1, если их не было найдено.

Для int[], long[] и т.д. могут быть добавлены перегрузки. Тело метода останется прежним.

Для массивов объектов

Для массивов объектов, таких как String[], мы могли бы использовать ту же идею и иметь шаг фильтрации, используя метод equals, или Objects.equals, чтобы рассмотреть два элемента null, вместо ==.

Но мы можем сделать это проще:

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

Создает оболочку списка для входного массива с помощью Arrays.asList и ищет индекс элемента indexOf.

Это решение не работает для примитивных массивов как показано здесь: примитивный массив вроде int[] не является Object[], а Object; как таковой, вызов asList на нем создает список одного элемента, который является данным массивом, а не списком элементов массива.

Ответ 6

Проблема с вашим кодом заключается в том, что когда вы делаете

 list[] == "e"

вы спрашиваете, равен ли объект массива (а не содержимое) строке "e", что явно не так.

Вы хотите перебрать содержимое, чтобы выполнить требуемый чек:

 for(String element : list) {
      if (element.equals("e")) {
           // do something here
      }
 }

Ответ 7

Теперь он печатает 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;
     }
 }

Имейте в виду, что

"e"

является строковым объектным литералом (который представляет собой строковый объект)

Пока

'е'

Является символьным литералом (который представляет собой примитивный тип данных символа)

Даже когда

list[]

Было бы корректным Java (что не так), сравнивая элемент символа со строковым элементом, так или иначе возвращающим false.

Просто используйте эту строковую функцию indexOf, и вы можете найти любой символ в любом алфавите (или массиве символов)

Ответ 8

Очень сильно отредактировано. Я думаю, что вы этого хотите:

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

(Обратите внимание, что вам, возможно, придется настроить метод init, если вы хотите использовать 1-26 вместо 0-25)

или вы хотите:

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

Во-вторых, если вы всегда хотите a = 1, z = 26. Первый позволит вам вставить строку типа "qwerty" и назначить q = 0, w = 1, e = 2, r = 3...

Ответ 9

Этот способ должен работать, изменить "char" на "Character":

public static void main(String[] args){
  Character[] list = {'m', 'e', 'y'};
  System.out.println(Arrays.asList(list).indexOf('e')); // print "1"
}

Ответ 10

Если начальный порядок элементов не очень важен, вы можете просто отсортировать массив, а затем binarySearch it:

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

Ответ 11

Я предоставляю правильный метод для этого.

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