Вопрос-ответ

How to find the index of an element in an array in Java?

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

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

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

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

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

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

Переведено автоматически
Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Начиная с 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[] это не an Object[], а an Object; таким образом, вызов asList для него создает список из одного элемента, который является данным массивом, а не список элементов массива.

Ответ 4

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

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'));
java arrays