Как найти индекс элемента в массиве в Java? - PullRequest
46 голосов
/ 06 октября 2009

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

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

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

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

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

Ответы [ 14 ]

49 голосов
/ 06 октября 2009

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

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

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

17 голосов
/ 19 июня 2014

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

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

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

17 голосов
/ 06 октября 2009

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

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'));
10 голосов
/ 02 октября 2016

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

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

7 голосов
/ 06 октября 2009

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

for (int i = 0; i < list.length; i++) {
  if (list[i] == 'e') {
    System.out.println(i);
    break;
  }
}
4 голосов
/ 06 октября 2009

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

 list[] == "e"

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

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

 for(String element : list) {
      if (element.equals("e")) {
           // do something here
      }
 }
3 голосов
/ 26 марта 2018

Самое простое решение :

Преобразование массива в список, и вы можете получить положение элемента.

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

Другое решение , вы можете использовать массив итераторов:

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;
    }
}
2 голосов
/ 06 октября 2009

Теперь он печатает 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, и вы можете найти любой символ в любом алфавите (или массиве символов)

1 голос
/ 17 апреля 2018

вот еще один пример и как indexOf работает.

public int indexOf(Object target) {
    for (int i = 0; i < array.length; i++) {
        if (equals(target, array[i])) {
            return i;
        }
    }
    return -1;
}
1 голос
/ 02 апреля 2016

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

public static void main(String[] args){
  Character[] list = {'m', 'e', 'y'};
  System.out.println(Arrays.asList(list).indexOf('e')); // print "1"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...