Кращий спосіб знайти індекс елемента в 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 або символом '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 - це ваша позиція.
Хірен Патель,

6

Якщо ваш файл Listвідсортований і має хороший довільний доступ (як ArrayListце робиться), вам слід заглянути Collections.binarySearch. В іншому випадку вам слід використовувати List.indexOf, як зазначали інші.

Але ваш алгоритм є надійним, fwiw (крім ==інших, на які вказували інші).


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

Java API визначає два методи, які ви можете використовувати: indexOf(Object obj)і lastIndexOf(Object obj). Перший повертає індекс елемента, якщо він знайдений, -1 - інакше. Другий повертає останній індекс, що було б як пошук у списку назад.


1

Найкращий спосіб знайти позицію елемента у списку - за допомогою інтерфейсу Collections,

Наприклад,

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

Вихід: 2


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.