Можно ли в java узнать индекс элемента в ArrayList
, если известно значение?
При нажатии на пункт списка показывает значения
@Override
public int getItemCount() {
return mFilteredCheeses.size();
}
public void filter(String query) {
mFilteredCheeses = new ArrayList<>();
for (String cheese : mDefaultCheeses) {
if(cheese.toLowerCase().contains(query.toLowerCase())) {
mFilteredCheeses.add(cheese);
}
}
notifyDataSetChanged();
}
А есть ли возможность узнать индекс элемента, например со значением Макс
?
задан 16 сен 2016 в 21:42
0
Есть у ArrayList метод indexOf – он как раз ищет подходящий элемент и выводит его индекс.
ArrayList<Object> test = new ArrayList<>();
test.add("yo");
test.add("yo2");
System.out.println(test.indexOf("yo2")); // Выведет: 1
Если в списке несколько одинаковых значений, то выведет индекс первого попавшегося.
ответ дан 16 сен 2016 в 21:53
Алексей ШиманскийАлексей Шиманский
72.2k11 золотых знаков87 серебряных знаков173 бронзовых знака
3
Смотря что Вы хотите сделать под формулировкой макс.
Если это последний индекс нужного элемента то lastIndexOf(value)
.
Можно через цикл, и там через условие то что Вам надо. напишите подробнее если это не подходит.
ArrayList<Object> test = new ArrayList<>();
test.add("yo");
test.add("yo2");
test.add("yo3");
test.add("yo2");
System.out.println(test.indexOf("yo2"));
System.out.println(test.lastIndexOf("yo2"));
ответ дан 17 сен 2016 в 9:50
maksonmakson
5163 серебряных знака19 бронзовых знаков
1
В этом посте будет обсуждаться, как найти индекс элемента в массиве примитивов или объектов в Java.
Решение должно либо возвращать индекс первого вхождения требуемого элемента, либо -1, если его нет в массиве.
1. Наивное решение — линейный поиск
Наивное решение состоит в том, чтобы выполнить линейный поиск в заданном массиве, чтобы определить, присутствует ли целевой элемент в массиве.
⮚ Для примитивных массивов:
// Метод поиска индекса элемента в примитивном массиве в Java public static int find(int[] a, int target) { for (int i = 0; i < a.length; i++) { if (a[i] == target) { return i; } } return –1; } |
⮚ Для массивов объектов:
// Общий метод для поиска индекса элемента в массиве объектов в Java public static<T> int find(T[] a, T target) { for (int i = 0; i < a.length; i++) { if (target.equals(a[i])) { return i; } } return –1; } |
2. Использование потока Java 8
Мы можем использовать Java 8 Stream для поиска индекса элемента в массиве примитивов и объектов, как показано ниже:
⮚ Для примитивных массивов:
// Метод поиска индекса элемента в примитивном массиве в Java public static int find(int[] a, int target) { return IntStream.range(0, a.length) .filter(i -> target == a[i]) .findFirst() .orElse(–1); // вернуть -1, если цель не найдена } |
⮚ Для массивов объектов:
// Общий метод для поиска индекса элемента в массиве объектов в Java public static<T> int find(T[] a, T target) { return IntStream.range(0, a.length) .filter(i -> target.equals(a[i])) .findFirst() .orElse(–1); // вернуть -1, если цель не найдена } |
3. Преобразовать в список
Идея состоит в том, чтобы преобразовать данный массив в список и использовать List.indexOf()
метод, который возвращает индекс первого вхождения указанного элемента в этом списке.
⮚ Для примитивных массивов:
Как преобразовать примитивный целочисленный массив в List<Integer>?
// Метод поиска индекса элемента в примитивном массиве в Java public static int find(int[] a, int target) { return Arrays.stream(a) // IntStream .boxed() // Stream<Integer> .collect(Collectors.toList()) // List<Integer> .indexOf(target); } |
⮚ Для массивов объектов:
Как преобразовать массив объектов в список?
// Общий метод для поиска индекса элемента в массиве объектов в Java public static<T> int find(T[] a, T target) { return Arrays.asList(a).indexOf(target); } |
4. Бинарный поиск отсортированных массивов
Для отсортированных массивов мы можем использовать Алгоритм бинарного поиска для поиска указанного массива для указанного значения.
⮚ Для примитивных массивов:
// Метод поиска индекса элемента в примитивном массиве в Java public static int find(int[] a, int target) { int index = Arrays.binarySearch(a, target); return (index < 0) ? –1 : index; } |
⮚ Для массивов объектов:
// Общий метод для поиска индекса элемента в массиве объектов в Java public static<T> int find(T[] a, T target) { int index = Arrays.binarySearch(a, target); return (index < 0) ? –1 : index; } |
5. Использование библиотеки Guava
⮚ Для примитивных массивов:
Библиотека Guava предоставляет несколько служебных классов, относящихся к примитивам, например Ints для инт, Longs
надолго, Doubles
на двоих, Floats
для поплавка, Booleans
для логического значения и так далее.
Каждый класс полезности имеет indexOf()
метод, который возвращает индекс первого появления цели в массиве. Мы также можем использовать lastIndexOf()
чтобы вернуть индекс последнего появления цели в массиве.
// Метод поиска индекса элемента в примитивном массиве в Java public static int find(int[] a, int target) { return Ints.indexOf(a, target); } |
⮚ Для массивов объектов:
Guava’s com.google.commons.collect.Iterables класс содержит статический служебный метод indexOf(Iterator, Predicate)
который возвращает индекс первого элемента, удовлетворяющего предоставленному предикату, или -1, если итератор не имеет таких элементов.
// Общий метод для поиска индекса элемента в массиве объектов в Java public static<T> int find(T[] a, T target) { int index = Iterators.indexOf(Iterators.forArray(a), new Predicate<T>() { public boolean apply(T input) { return input.equals(target); } }); return index; } |
Мы также можем использовать com.google.common.base.Predicates класс, предоставляемый Guava, который содержит статические служебные методы, относящиеся к Predicate
экземпляры.
// Общий метод для поиска индекса элемента в массиве объектов в Java public static<T> int find(T[] a, T target) { int index = Iterators.indexOf(Iterators.forArray(a), Predicates.in(Collections.singleton(target))); return index; } |
Для Java 8 и выше мы можем использовать лямбда-выражения:
// Общий метод для поиска индекса элемента в массиве объектов в Java public static<T> int find(T[] a, T target) { return Iterators.indexOf(Iterators.forArray(a), x -> x.equals(target)); } |
6. Использование Apache Commons Lang
Apache Commons Ланг ArrayUtils класс содержит несколько статических служебных методов, которые работают с массивами примитивов или объектов. Он обеспечивает indexOf()
метод, который находит индекс заданного значения в массиве.
⮚ Для примитивных массивов:
// Метод поиска индекса элемента в примитивном массиве в Java public static int find(int[] a, int target) { return ArrayUtils.indexOf(a, target); } |
⮚ Для массивов объектов:
// Общий метод для поиска индекса элемента в массиве объектов в Java public static<T> int find(T[] a, T target) { return ArrayUtils.indexOf(a, target); } |
Вот и все, что касается поиска индекса элемента в массиве в Java.
Для примера возьмём массив из строк, чтобы сравнивать буквы, а не числа. Так легче понять. Всего 10 элементов в массиве.
var massiv = ["qw","qe","qr","as","ad","af","zx","zc","zv","qaz"]
Как узнать под каким индексом находится элемент в массиве?
В этом нам поможет метод прототипов объекта Array — findIndex(). Он проверяет элементы массива по какому-то определённому условию. Если «условие выполняется«(true) и элемент находится в массиве, тогда возвращается его индекс (целое положительное число или 0). Если «условие НЕ выполняется«(false) и элемент не найден в массиве, тогда возвращается «-1».
Важно отметить, что если в массиве будет несколько одинаковых значений у разных элементов, то метод findIndex() достанет только самый первый из них.
И ещё, метод findIndex() создаёт новый массив и не изменяет тот, на котором вызывается. Это важно для сохранности данных.
Решаем вопрос
Пробуем получить индекс элемента, у которого значение «zx»
massiv.findIndex(i => i == "zx") 6 // результат - номер индекса
massiv.findIndex(i => i == "as") 3 // результат - номер индекса
massiv.findIndex(i => i == "qw") 0 // результат - номер индекса
Для каждого элемента i мы проверили условие, что i равняется строковому значению. Когда метод находил совпадения, тогда он возвращал номер индекса, существующего элемента.
Пробуем получить индекс элемента, которого нет в массиве
massiv.findIndex(i => i == "ty") -1 // индекса нет
massiv.findIndex(i => i == "gh") -1 // индекса нет
massiv.findIndex(i => i == "bn") -1 // индекса нет
Если в массиве несколько одинаковых значений?
Добавим несколько одинаковых элементов в массив:
massiv[10] = "as"
massiv[11] = "as"
Теперь, если мы попробуем получить индекс элемента, который содержит «as», то мы получим только индекс 3. Индексы 10 и 11 мы не увидим.
Читай публикацию JavaScript | Как получить индексы элементов с одинаковыми значениями в массиве?, чтобы понять как решить эту задачу.
Информационные ссылки
JavaScript | Массивы (Array)
findIndex() — метод прототипов объекта Array
Стандарт ECMAScript — Living Standard — https://tc39.es/ecma262/#sec-array.prototype.findindex
Как по проще, зная элемент, определить его номер в массиве?
Ученик
(239),
закрыт
5 лет назад
Дополнен 5 лет назад
Разумеется, можно тупо записать каждому элементу его номер в соответствующий атрибут. Но некоторые валидаторы при виде нестандартного атрибута начинают верещать
Дополнен 5 лет назад
Кажется, вариант для некоторых случаев (для DOM -элементов) нашел. Если каждому элементу присвоить номер в атрибуте data-имя_аттриб, то валидацию вроде пройдет. Т. е. data-position = 1, data-position = 2… Причем везде кроме 10-Ослика и ниже можно обратиться к таким атрибутам по свойству: элемент. dataset.имя_аттриб
i = imgChosen.dataset.position
AlexBrin
Мыслитель
(5000)
5 лет назад
Сразу видно, что два предыдущих ответа от тех, кто не знает языка
array.indexOf(‘значение’)
Вернет ключ, если элемент найден (от 0 и больше)
Если значения нет, то вернет -1
Важно: indexOf проводит строгое сравнивание (то есть ===)
Андрей
Высший разум
(267337)
5 лет назад
А зачем использовать нестандартные атрибуты? Для этих целей существует специальный тип произвольных пользовательских атрибутов, имеющих префикс “data-“. Так что можешь написать data-id=”3″ или data-number=”17” – и это будет полностью соответствовать стандарту HTML. И для работы с data-атрибутами в JavaScript есть специальный набор методов.
Подробности: https://webref.ru/html/attr/data
0 / 0 / 0 Регистрация: 07.10.2020 Сообщений: 15 |
|
1 |
|
Определить индекс элемента массива имеющего заданное значение07.10.2020, 19:34. Показов 22153. Ответов 17
Ребята, завтра нужно сдать задачи. Сам не успеваю все сделать, поэтому хотел бы попросить вас помочь с частью задачек. Cтудент ВМК МГУ 1 курс 1) Составить программу, выдающую индексы заданного элемента или сообщающую, что такого элемента в массиве нет.
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
07.10.2020, 19:34 |
17 |
NQUARE Искусственный интеллект 112 / 82 / 34 Регистрация: 26.08.2020 Сообщений: 590 Записей в блоге: 1 |
||||||||
07.10.2020, 21:17 |
2 |
|||||||
Ну или если
заданного элемента
1 |
0 / 0 / 0 Регистрация: 07.10.2020 Сообщений: 15 |
|
07.10.2020, 22:14 [ТС] |
3 |
Добавлено через 2 минуты Добавлено через 12 минут
0 |
76 / 68 / 10 Регистрация: 11.07.2016 Сообщений: 320 |
|
08.10.2020, 00:10 |
4 |
Потому что проверка if (idx) не проходится, если индекс 0.
0 |
NQUARE Искусственный интеллект 112 / 82 / 34 Регистрация: 26.08.2020 Сообщений: 590 Записей в блоге: 1 |
||||||||
08.10.2020, 06:42 |
5 |
|||||||
Сообщение было отмечено studentmsu569 как решение Решение
Добавлено через 2 минуты
Добавлено через 1 минуту
idx != -1 Можно и idx >= 0
0 |
0 / 0 / 0 Регистрация: 07.10.2020 Сообщений: 15 |
|
08.10.2020, 09:14 [ТС] |
6 |
NQUARE, спасибо за все ответы, не мог бы ты еще помочь с этим, если найдется время: В одномерном массиве, состоящем из n вещественных элементов, вычислить:
0 |
NQUARE Искусственный интеллект 112 / 82 / 34 Регистрация: 26.08.2020 Сообщений: 590 Записей в блоге: 1 |
||||||||||||
08.10.2020, 10:20 |
7 |
|||||||||||
-минимальный по модулю элемент массива;
сумму модулей элементов массива, расположенных после первого элемента, целая часть которого равна нулю.
Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в четных позициях, а во второй половине – элементы, стояв-шие в нечетных позициях.
Добавлено через 3 минуты
0 |
studentmsu569 0 / 0 / 0 Регистрация: 07.10.2020 Сообщений: 15 |
||||
08.10.2020, 10:42 [ТС] |
8 |
|||
NQUARE, мне уже неудобно, но забыл важную деталь в условии: Составить программу с использованием одномерных массивов для решения задачи на переупорядочивание элементов массива. Создать исходный массив, используя генератор случайных чисел. Вот пример программы, в которой создается массив вещественных случайных чисел в диапазоне от -5 до 7, если это ускорит процесс:
0 |
Искусственный интеллект 112 / 82 / 34 Регистрация: 26.08.2020 Сообщений: 590 Записей в блоге: 1 |
|
08.10.2020, 11:02 |
9 |
Составить программу с использованием одномерных массивов для решения задачи на переупорядочивание элементов массива. Создать исходный массив, используя генератор случайных чисел. Что то я не понял, можно как то по подробней
0 |
0 / 0 / 0 Регистрация: 07.10.2020 Сообщений: 15 |
|
08.10.2020, 11:15 [ТС] |
10 |
NQUARE, NQUARE, в условии перед этим всем, числа нужно определять рандомом, то есть составить рандомный массив, и только потом выполнять с этим рандомным массивом эти три операции
0 |
NQUARE Искусственный интеллект 112 / 82 / 34 Регистрация: 26.08.2020 Сообщений: 590 Записей в блоге: 1 |
||||
08.10.2020, 11:26 |
11 |
|||
studentmsu569, Типо так?:
0 |
0 / 0 / 0 Регистрация: 07.10.2020 Сообщений: 15 |
|
08.10.2020, 11:35 [ТС] |
12 |
NQUARE, дааа все так)))
0 |
NQUARE Искусственный интеллект 112 / 82 / 34 Регистрация: 26.08.2020 Сообщений: 590 Записей в блоге: 1 |
||||
08.10.2020, 11:38 |
13 |
|||
Вот всё вместе:
0 |
0 / 0 / 0 Регистрация: 07.10.2020 Сообщений: 15 |
|
08.10.2020, 11:54 [ТС] |
14 |
NQUARE, еще небольшой вопросик в условии к второму написано :
-сумму модулей элементов массива, расположенных после первого элемента, целая часть которого равна нулю. целая часть которого равна нулю, получается у нас 12 не должно быть в сумме? или я просто чего-то не понимаю? Добавлено через 4 минуты
чтобы в первой его половине располагались элементы, стоявшие в четных позициях, а во второй половине – элементы, стояв-шие в нечетных позициях. NQUARE, выводит наоборот сначала нечетные, а потом четные, или опять же может я просто тупой
0 |
Искусственный интеллект 112 / 82 / 34 Регистрация: 26.08.2020 Сообщений: 590 Записей в блоге: 1 |
|
08.10.2020, 11:57 |
15 |
выводит наоборот сначала нечетные Нет, всё норм выводит. Сначала на чётных позициях Код -4.98498 1.76302 -2.68035 4.70489 2.02011 1.76302 9 -2.68035 2.02011 -4.98498 4.70489 1.76302
0 |
0 / 0 / 0 Регистрация: 07.10.2020 Сообщений: 15 |
|
08.10.2020, 12:02 [ТС] |
16 |
NQUARE, но он же сначала выводит 3 5 1 элемент а потом 2 и 4 3 5 1 это нечетные числа насколько я знаю
0 |
Искусственный интеллект 112 / 82 / 34 Регистрация: 26.08.2020 Сообщений: 590 Записей в блоге: 1 |
|
08.10.2020, 12:08 |
17 |
елая часть которого равна нулю, получается у нас 12 не должно быть в сумме? или я просто чего-то не понимаю? А, нет, это я вас не правильно понял. Сейчас постараюсь объяснить Добавлено через 3 минуты
но он же сначала выводит 3 5 1 элемент а потом 2 и 4 А вам нечётный по номеру надо было? Я сделал по индексу Добавлено через 1 минуту
0 |
NQUARE Искусственный интеллект 112 / 82 / 34 Регистрация: 26.08.2020 Сообщений: 590 Записей в блоге: 1 |
||||
08.10.2020, 19:59 |
18 |
|||
в условии к второму написано : Я не пойму, сумму модулей элементов массива целая часть которых равна нулю и которые стоят после первого элемента, или всё таки сумму модулей элементов массива, расположенных после первого элемента целая часть которого равна нулю??? Добавлено через 41 секунду
елая часть которого равна нулю, получается у нас 12 не должно быть в сумме? или я просто чего-то не понимаю? Если вы правильно написали условие, то нет. Добавлено через 1 минуту
Добавлено через 1 минуту
Вот всё вместе: И тута с выводом, если надо.
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
08.10.2020, 19:59 |
18 |