Как найти индекс массива 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). А может быть, у объекта уже есть метод поиска? Скорее всего, там будет тот же перебор, но лежать он будет уже не на вашей совести.