Для приложения 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, которую я должен использовать?
==
в большинстве случаев приведет к неверным результатам.==
... это просто неправильное сравнение ;-)String.equals
больше похоже на то, что===
может быть на таком языке, как JavaScript? например. проверяет значение И тип?==
- это объект-идентичность, и это означает «это тот же объект» . (Это представление справедливо как для примитивных значений, так и для ссылочных типов, если учесть, что существует только одно число со значением 42 или char 'x' и т. Д.).Object.equals
- это виртуальный метод, определенный для всех экземпляров объекта, и это означает, что «имеет одинаковое значение» , поскольку все типы классов расширяют Object, и должен использоваться для всех тестов на равенство объектов . На cover==
vs есть много вопросов,Object.equals
и это очень важная концепция, которую нужно понять! Например, это неверно"hello" == new String("hello")
:! Дох!Ответы:
ArrayList
естьindexOf()
метод . Проверьте API, чтобы узнать больше, но вот как это работает:private ArrayList<String> _categories; // Initialize all this stuff private int getCategoryPos(String category) { return _categories.indexOf(category); }
indexOf()
вернет именно то, что возвращает ваш метод, быстро.источник
==
а indexOf -equals()
.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.
Выполнено
источник
Если ваш
List
отсортирован и имеет хороший произвольный доступ (какArrayList
и), вам следует изучитьCollections.binarySearch
. В противном случае вы должны использоватьList.indexOf
, как указывали другие.Но ваш алгоритм хорош, fwiw (кроме
==
других указали).источник
В java действительно есть причудливая нативная функция shmancy, которую вы должны использовать.
ArrayList имеет метод экземпляра, называемый
indexOf(Object o)
(http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html)
Вы могли бы назвать это
_categories
следующим образом:_categories.indexOf("camels")
У меня нет опыта программирования для Android, но это подойдет для стандартного Java-приложения.
Удачи.
источник
API Java определяет два метода, которые вы можете использовать:
indexOf(Object obj)
иlastIndexOf(Object obj)
. Первый возвращает индекс элемента, если он найден, иначе -1. Второй возвращает последний индекс, что похоже на поиск по списку в обратном направлении.источник
Лучший способ найти позицию элемента в списке - использовать интерфейс коллекций,
Например,
List<Integer> sampleList = Arrays.asList(10,45,56,35,6,7); Collections.binarySearch(sampleList, 56);
Выход: 2
источник
Используйте метод indexOf (), чтобы найти первое вхождение элемента в коллекции.
источник
лучшее решение здесь
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)
источник