Подтвердить что ты не робот

Лучший способ найти индекс элемента из ArrayList <CustomObject>

Прежде всего, пожалуйста, исправьте меня, если я ошибаюсь. Я хочу найти индекс Item (i.e String value) из ArrayList<CustomType> без использования For Loop.

POJO:

id;
name;

код:

ArrayList<POJO> list = new ArrayList<POJO>;

//Lots of data added to these list...

Теперь я хочу найти идентификатор конкретного имени из arraylist, не используя ниже для цикла.

String id = null;
// TODO Auto-generated method stub
for (int i = 0; i < list.size(); i++) {
    if("ABCD".equalsIgnoreCase(list.get(i).getName())) {
        id = list.get(i).getId();
        break;
    }
}

В идеале я не хочу реализовывать цикл For, потому что в некоторых случаях у меня есть более 500 данных в списке и поиск индекса с использованием цикла For - это не лучший способ сделать это.

4b9b3361

Ответ 1

Спасибо всем за ваш добрый и быстрый ответ. Но особое спасибо Иоахим Зауэр. Вы абсолютно правы, что 500 элементов не так много, скорее всего, этот цикл не оказывает реального влияния на производительность вашего кода (даже если он неэффективен). Даже я пробую его до 5000 элементов и все еще нет негативного влияния на производительность.

Спасибо всем и еще раз спасибо за ваш комментарий Иоахим Зауэр.

Ответ 2

Вы можете использовать list.indexOf(), но для его работы вам необходимо переопределить equals и hasCode вашего POJO.

По умолчанию два объекта будут считаться равными, если они имеют одну и ту же ссылку. Вы можете перезаписать equals для работы в вашем случае:

public boolean equals(Object o) {
  if (!(o instanceof POJO)) {
    return false;
  }
  POJO other = (POJO) o;
  return name.equalsIgnoreCase(other.getName());
}

Выравнивание равнозначит, что вы переопределяете hashCode. Например:

public int hashCode() {
  return name.hashCode();
}

Ответ 3

Поиск элемента таким образом, где сложность даст вам BIG-O (n). Я думаю, если вы сделаете карту, это даст вам лучший результат.

HashMap - лучший выбор. - Где сложность будет O (1).

Ответ 4

Если вам нужно искать строковое значение, вы должны использовать HashMap вместо ArrayList.

Ответ 5

Вы можете использовать List.indexOf() - но вы должны убедиться, что вы также переопределите POJO.equals() - (и как часть соглашения - также hashCode().

Обратите внимание, что тем не менее - результат будет O(n) - альтернативой может быть использование отсортированного массива (POJO[]) и использование Arrays.binarySearch() или Set/Map.

Если вы используете массив и binarySearch() - вы должны убедиться, что POJO также реализует Comparable<POJO>


Обратите внимание, что для статических данных (ваш список не меняется часто/вообще) - хотя массивы и binarySearch() хуже, чем HashSet с точки зрения значительных нотных обозначений, на практике - часто намного быстрее, особенно для относительно коротких списков.
В терминах обозначения большой-O хэш-решение предлагает доступ к среднему случаю O(1).