Java индекс элемента в массиве как узнать
Перейти к содержимому

Java индекс элемента в массиве как узнать

  • автор:

Как найти индекс массива java

Чтобы найти индекс искомого элемента в массиве можно в цикле перебрать все элементы и сравнить их с искомым. Если они равны, будет выведен индекс первого подходящего элемента.

// Число, которое будем искать int num = 3; // Переменная для хранения индекса, // найденного числа int index = -1; int[] arr = 1, 2, 3, 4, 5>; for (int i = 0; i  arr.length; i++)  // Если элемент и число равны, то // сохраняй индекс if (arr[i] == num)  index = i; > > System.out.println(index); // => 2 

Также можно воспользоваться пакетом org.apache.commons.lang , методом indexOf() из класса ArrayUtils для нахождения индекса элемента.

import org.apache.commons.lang3.ArrayUtils; public class Example  public static void main(String[] args)  int[] arr = 1, 2, 3, 4, 5>; // индекс числа 3 int index = ArrayUtils.indexOf(arr, 3); System.out.println(index); // => 2 > > 

Поиск элемента в массиве

Достаточно частая задача — это поиск элемента в массиве. Допустим у нас есть массив 1,5,8,10,16,20. 100 и нам нужно найти позицию элемента 10 в нем. Или вообще выяснить есть ли такой элемент в массиве.

Существуют следующие алгоритмы решающие эту задачу —

  • Линейный поиск — О(n)
  • Двоичный поиск — O(log (N))
  • Поиск прыжками — O(sqrt (N))
  • Интерполяционный поиск — O(log log N)
  • Экспоненциальный поиск — O(log (N))

Рассмотрим некоторые из них.

1. Линейный поиск

Самый простой, но и самый долгий алгоритм. Перебираем элементы массива и сравниваем с elementToSearch, который мы должны найти.

 public static int linearSearch(int[] array, int elementToSearch) < for (int i = 0; i < array.length; i++) < if (array[i] == elementToSearch) < return i; >> return -1; >

2. Двоичный поиск, итеративный подход

Для использования алгоритма, массив должен быть отсортирован. Идея метода состоит в том, что мы делим массив пополам, берем «средний элемент» с индексом middleIndex, и сравниваем с искомым. Если они равны, мы заканчиваем поиск. Если искомый элемент меньше «среднего элемента» мы отбрасываем правую часть массива, иначе — левую. После чего повторяем эти операции снова и снова, пока искомый элемент не будет найден, или пока новый отрезок не станет пустым. Если элемент не нашелся возвращаем значение -1.

public static int binarySearch(int[] array, int elementToSearch) < int firstIndex = 0; int lastIndex = array.length - 1; // условие прекращения (элемент не представлен) while (firstIndex // если средний элемент меньше // направляем наш индекс в middle+1, убирая первую часть из рассмотрения else if (array[middleIndex] < elementToSearch) < firstIndex = middleIndex + 1; >// если средний элемент больше // направляем наш индекс в middle-1, убирая вторую часть из рассмотрения else if (array[middleIndex] > elementToSearch) < lastIndex = middleIndex - 1; >> return -1; >

3. Двоичный поиск, рекурсивный подход

 public static int recursiveBinarySearch(int[] array, int firstElement, int lastElement, int elementToSearch) < // условие прекращения if (lastElement >= firstElement) < int middle = (lastElement + firstElement) / 2; // если средний элемент - целевой элемент, вернуть его индекс if (array[middle] == elementToSearch) < return middle; >// если средний элемент больше целевого // вызываем метод рекурсивно по суженным данным if (array[middle] > elementToSearch) < return recursiveBinarySearch(array, firstElement, middle - 1, elementToSearch); >// также, вызываем метод рекурсивно по суженным данным return recursiveBinarySearch(array, middle + 1, lastElement, elementToSearch); > return -1; >

4. Поиск прыжками

 public static int jumpSearch(int[] array, int elementToSearch) < int arrayLength = array.length; int jumpStep = (int) Math.sqrt(array.length); int previousStep = 0; while (array[Math.min(jumpStep, arrayLength) - 1] < elementToSearch) < previousStep = jumpStep; jumpStep += (int) (Math.sqrt(arrayLength)); if (previousStep >= arrayLength) < return -1; >> while (array[previousStep] < elementToSearch) < previousStep++; if (previousStep == Math.min(jumpStep, arrayLength)) < return -1; >> if (array[previousStep] == elementToSearch) < return previousStep; >return -1; >
  • Среднее арифметическое
  • Числа Фибоначчи
  • Вычисление сложности алгоритма
  • Метод swap
  • Реверс массива
  • Алгоритм сортировки пузырьком
  • Сортировка выбором
  • Задания

Получить индекс значения массива java

Есть строковый массив системных шрифтов fontNames. Как узнать какой индекс у элемента массива, значение которого Times New Roman ?

Отслеживать
8,910 11 11 золотых знаков 31 31 серебряный знак 55 55 бронзовых знаков
задан 13 сен 2016 в 12:28
319 1 1 золотой знак 4 4 серебряных знака 18 18 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Вернёт индекс элемента в массиве String :

String[] s = ; System.out.println(Arrays.asList(s).indexOf("Times New Roman")); 

Отслеживать
ответ дан 13 сен 2016 в 12:44
8,910 11 11 золотых знаков 31 31 серебряный знак 55 55 бронзовых знаков
Спасибо большое! Реально помогло! 🙂
13 сен 2016 в 13:03

Обратите внимание, что Arrays.asList(s).indexOf() работает только с объектами. Т.е.

int[] s = ; System.out.println(Arrays.asList(s).indexOf(1)); 

всегда будет выдавать «-1».

Отслеживать
51.6k 201 201 золотой знак 63 63 серебряных знака 245 245 бронзовых знаков
ответ дан 18 авг 2017 в 7:48
71 1 1 серебряный знак 1 1 бронзовый знак

  • java
  • массивы
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.9.3159

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Java индекс элемента в массиве как узнать

Всем доброго времени суток.

Извиняюсь за глупый вопрос, но сам и в поиске ответа найти не могу. Есть массив объектов некторого типа и сам объект. Как узнать его индекс в этом массиве? Кроме перебора естественно. Если такого нет в стандартных пакетах, то как написать дженерик метод, который будет работать с любым типом объектов? Попробовал сам ,что-то не получается — через дженерик класс вроде как можно, а через метод не выходит.

Сам начинающий, просьба отнестись с пониманием

It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re: Индекс элемента в массиве

От: bolshik http://denis-zhdanov.blogspot.com/
Дата: 18.08.06 15:02
Оценка:

Здравствуйте, Master Yoda, Вы писали:

MY>Всем доброго времени суток.

MY>Извиняюсь за глупый вопрос, но сам и в поиске ответа найти не могу. Есть массив объектов некторого типа и сам объект. Как узнать его индекс в этом массиве? Кроме перебора естественно. Если такого нет в стандартных пакетах, то как написать дженерик метод, который будет работать с любым типом объектов? Попробовал сам ,что-то не получается — через дженерик класс вроде как можно, а через метод не выходит.

MY>Сам начинающий, просьба отнестись с пониманием

Уже все написано. java.util.Map называется

Re: Индекс элемента в массиве

От: Trean http://axamit.com/
Дата: 18.08.06 15:30
Оценка:

Здравствуйте, Master Yoda, Вы писали:

MY>Всем доброго времени суток.

MY>Извиняюсь за глупый вопрос, но сам и в поиске ответа найти не могу. Есть массив объектов некторого типа и сам объект. Как узнать его индекс в этом массиве? Кроме перебора естественно. Если такого нет в стандартных пакетах, то как написать дженерик метод, который будет работать с любым типом объектов? Попробовал сам ,что-то не получается — через дженерик класс вроде как можно, а через метод не выходит.

MY>Сам начинающий, просьба отнестись с пониманием

Если объект Comparable и массив отсортированный, то можно и бинарным поиском воспользоваться. Иначе Map используйте, где E тип вашего объекта.

Re[2]: Индекс элемента в массиве

От: Master Yoda
Дата: 18.08.06 15:43
Оценка:

Здравствуйте, Trean, Вы писали:

T>Если объект Comparable и массив отсортированный, то можно и бинарным поиском воспользоваться.

Не подойдет

T>Иначе Map используйте, где E тип вашего объекта.

Задачи, где нужно будет узнать индекс — разовые, смысла городить там мап нет совершенно никакого. Массив получаю через стандартные методы, например Table.getColumnOrder. После этого мне просто единожды нужно узнать индекс объекта в этом массиве. Если где-то здесь и есть кривость ,то только из-за недостаточно продуманного интерфейса SWT который почему-то не позволяет получить индекс столбца имея его объект.

Есть какие-нибудь другие варианты? Почему нельзя написать вспомагельный классик с дженерик методом ,который будет получать индекс на основе простого перебора. У меня не получилось, может кто-нибудь показать пример?

It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[3]: Индекс элемента в массиве

От: ika
Дата: 18.08.06 17:04
Оценка:

Здравствуйте, Master Yoda, Вы писали:

MY>Есть какие-нибудь другие варианты? Почему нельзя написать вспомагельный классик с дженерик методом ,который будет получать индекс на основе простого перебора. У меня не получилось, может кто-нибудь показать пример?

Если в библиотеку включить «классик с методом, который будет получать индекс на основе перебора», то, боюсь, авторитет такой библиотеки выше не станет. В принципе, от непродуманного апи — то же самое.

Re[3]: Индекс элемента в массиве

От: Trean http://axamit.com/
Дата: 19.08.06 08:59
Оценка: 14 (1)

Здравствуйте, Master Yoda, Вы писали:

MY>Здравствуйте, Trean, Вы писали:

T>>Если объект Comparable и массив отсортированный, то можно и бинарным поиском воспользоваться.

MY>Не подойдет

T>>Иначе Map используйте, где E тип вашего объекта.

MY>Задачи, где нужно будет узнать индекс — разовые, смысла городить там мап нет совершенно никакого. Массив получаю через стандартные методы, например Table.getColumnOrder. После этого мне просто единожды нужно узнать индекс объекта в этом массиве. Если где-то здесь и есть кривость ,то только из-за недостаточно продуманного интерфейса SWT который почему-то не позволяет получить индекс столбца имея его объект.

MY>Есть какие-нибудь другие варианты? Почему нельзя написать вспомагельный классик с дженерик методом ,который будет получать индекс на основе простого перебора. У меня не получилось, может кто-нибудь показать пример?

public class Utils < public static indexByValue(T[] arr, Object val) < for(int i = 0; i < arr.length; i++) < if(val.equals(arr[i]) < // если объекты идентичны то можно и == использовать return i; > > return -1; > >

Re[3]: Индекс элемента в массиве

От: граммофон
Дата: 19.08.06 23:58
Оценка: 15 (2) +1

Здравствуйте, Master Yoda, Вы писали:

MY> Если где-то здесь и есть кривость ,то только из-за недостаточно продуманного интерфейса SWT который почему-то не позволяет получить индекс столбца имея его объект.

прежде чем понять рекурсию, необходимо понять рекурсию.
Re[4]: Индекс элемента в массиве

От: Trean http://axamit.com/
Дата: 20.08.06 13:45
Оценка:

Здравствуйте, Trean, Вы писали:

Опечатался малость =)

T>

T>public class Utils < T>public static indexByValue(T[] arr, T val) < T>for(int i = 0; i < arr.length; i++) < T>if(val.equals(arr[i]) < // если объекты идентичны то можно и == использовать T> return i; T> > T> > T> return -1; T> > T>> T>

Re: Индекс элемента в массиве

От: Infernal
Дата: 21.08.06 07:23
Оценка: 10 (2) +2

Здравствуйте, Master Yoda, Вы писали:

MY>Всем доброго времени суток.

Object[] array = new Object[] < "1" , "2" , "3" >; int index = Arrays.asList(array).indexOf( «2» ); System.out.println( «index o m»>

Re: Индекс элемента в массиве

От: dims12 http://www.relativity.ru
Дата: 31.08.06 21:47
Оценка:

Здравствуйте, Master Yoda, Вы писали:

MY>Есть массив объектов некторого типа и сам объект. Как узнать его индекс в этом массиве? Кроме перебора естественно.

Это было бы волшебством. Объект в массиве НИКАК нельзя найти, кроме как перебором. Если перебор не устраивает, то нужно либо самому написать, либо воспользоваться библиотечными средствами индексирования.

Допустим, Вы решили воспользоваться библиотечными средствами. В Джаве есть классы Set и Map. Они, как раз, занимаются индескированием тех объектнов, которые в них кладутся. НО! Процесс индексирования работает ДОЛЬШЕ, чем поиск перебором. Индексирование нужно для чего? Чтобы один раз составить проиндексированный массив, а потом много-много раз в нём быстро искать. Если искать надо всего один раз, то перебор БЫСТРЕЕ!

Ниже я прочитал, что массив Вы получаете из какого-то GUI объекта. Посмотрите в справке, быть может у этого объекта уже есть методы, которые возвращают проиндексированые массивы (например, Map). А может быть, у объекта уже есть метод поиска? Скорее всего, там будет тот же перебор, но лежать он будет уже не на вашей совести.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *