Лучший способ найти индекс элемента в ArrayList?

89

Для приложения Android у меня есть следующие функции

private ArrayList<String> _categories; // eg ["horses","camels"[,etc]]

private int getCategoryPos(String category) {
    for(int i = 0; i < this._categories.size(); ++i) {
        if(this._categories.get(i) == category) return i;
    }

    return -1;
}

Это «лучший» способ написать функцию для получения позиции элемента? Или есть в java причудливая нативная функция shmancy, которую я должен использовать?

Джексонкр
источник
2
Этот код, вероятно, ошибочен: использование ==в большинстве случаев приведет к неверным результатам.
3
Помните, вы не можете сравнивать строки с помощью '==', вы должны использовать String.equals (String str)
MrZander
5
@MrZander Конечно, вы можете сравнить их с ==... это просто неправильное сравнение ;-)
Вы можете сказать, что я все еще новичок в Java ... это String.equalsбольше похоже на то, что ===может быть на таком языке, как JavaScript? например. проверяет значение И тип?
Jacksonkr
3
== - это объект-идентичность, и это означает «это тот же объект» . (Это представление справедливо как для примитивных значений, так и для ссылочных типов, если учесть, что существует только одно число со значением 42 или char 'x' и т. Д.). Object.equals- это виртуальный метод, определенный для всех экземпляров объекта, и это означает, что «имеет одинаковое значение» , поскольку все типы классов расширяют Object, и должен использоваться для всех тестов на равенство объектов . На cover ==vs есть много вопросов, Object.equalsи это очень важная концепция, которую нужно понять! Например, это неверно "hello" == new String("hello"):! Дох!

Ответы:

192

ArrayListесть indexOf()метод . Проверьте API, чтобы узнать больше, но вот как это работает:

private ArrayList<String> _categories; // Initialize all this stuff

private int getCategoryPos(String category) {
  return _categories.indexOf(category);
}

indexOf() вернет именно то, что возвращает ваш метод, быстро.

Джон Эгеланн
источник
3
Он не «быстрее» с точки зрения сложности, чем опубликованный код, хотя может быть реализован более эффективно. Кроме того, indexOf здесь будет реагировать немного иначе: исходный код [неправильно] использует, ==а indexOf - equals().
Фактически, это почти такой же код (по крайней мере, в коде Sun Java 6, который у меня есть), за исключением того, что они запускают его с ветвью if-else, которая обрабатывает null отдельно.
yshavit
Он подключен к старым массивам и List <> имеет метод FindIndex (), но API меняется посередине для ArrayList: D
boctulus
16
ArrayList<String> alphabetList = new ArrayList<String>();
alphabetList.add("A"); // 0 index
alphabetList.add("B"); // 1 index
alphabetList.add("C"); // 2 index
alphabetList.add("D"); // 3 index
alphabetList.add("E"); // 4 index
alphabetList.add("F"); // 5 index
alphabetList.add("G"); // 6 index
alphabetList.add("H"); // 7 index
alphabetList.add("I"); // 8 index

int position = -1;
position = alphabetList.indexOf("H");
if (position == -1) {
    Log.e(TAG, "Object not found in List");
} else {
    Log.i(TAG, "" + position);
}

Вывод: Индекс списка: 7

Если вы передадите H, он вернет 7 , если вы передадите J, он вернет -1, поскольку мы определили значение по умолчанию как -1.

Выполнено

Хирен Патель
источник
Как я могу сделать наоборот: для вашего решения ваш ввод - H, и вы получаете позицию H. Предположим, если мой ввод - это индекс 7, как я могу получить значение String этого индекса. Спасибо
Джимале Абди
1
@JimaleAbdi Сделайте yourArrayList.get (7). 7 - твоя позиция.
Hiren Patel
6

Если ваш Listотсортирован и имеет хороший произвольный доступ (как ArrayListи), вам следует изучить Collections.binarySearch. В противном случае вы должны использовать List.indexOf, как указывали другие.

Но ваш алгоритм хорош, fwiw (кроме ==других указали).

Yshavit
источник
3

В java действительно есть причудливая нативная функция shmancy, которую вы должны использовать.

ArrayList имеет метод экземпляра, называемый

indexOf(Object o)

(http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html)

Вы могли бы назвать это _categoriesследующим образом:

_categories.indexOf("camels")

У меня нет опыта программирования для Android, но это подойдет для стандартного Java-приложения.

Удачи.

ржавый стебель
источник
1
нативная функция для меня подразумевает C \ C ++ .. Просто так.
Хантер МакМиллен
3

API Java определяет два метода, которые вы можете использовать: indexOf(Object obj)и lastIndexOf(Object obj). Первый возвращает индекс элемента, если он найден, иначе -1. Второй возвращает последний индекс, что похоже на поиск по списку в обратном направлении.

данка
источник
1

Лучший способ найти позицию элемента в списке - использовать интерфейс коллекций,

Например,

List<Integer> sampleList = Arrays.asList(10,45,56,35,6,7);
Collections.binarySearch(sampleList, 56);

Выход: 2

Pradeesh MP
источник
1

Используйте метод indexOf (), чтобы найти первое вхождение элемента в коллекции.

Васу Дев Гарг
источник
0

лучшее решение здесь

class Category(var Id: Int,var Name: String)
arrayList is Category list
val selectedPositon=arrayList.map { x->x.Id }.indexOf(Category_Id)
spinner_update_categories.setSelection(selectedPositon)
Фатих Чакироглу
источник