ArrayList Получить объект по идентификатору

Предположим, что у меня есть ArrayList<Account> моих пользовательских объектов, что очень просто. Например:

class Account
{
public String Name;
public Integer Id;
}

Я хочу получить конкретный объект Account на основе параметра Id во многих частях моего приложения. Что было бы лучше всего в этом?

Я думал о расширении ArrayList, но я уверен, что должен быть лучший способ.

Ответ 1

Похоже, что вы действительно хотите использовать это Map, который позволяет вам получать значения на основе ключа. Если вы придерживаетесь ArrayList, ваш единственный вариант - перебирать весь список и искать объект.

Что-то вроде:

for(Account account : accountsList) { 
   if(account.getId().equals(someId) { 
       //found it!
   }
}

против

accountsMap.get(someId)

Операция такого рода O(1) в Map, против O(n) в List.

Я думал о расширении ArrayList, но я уверен, что должно быть лучший способ.

Вообще говоря, это плохой дизайн. Прочитайте Эффективную Java, пункт 16, чтобы лучше понять, почему, или прочитайте эту статью.

Ответ 2

Предполагая, что это неупорядоченный список, вам нужно будет перебирать список и проверять каждый объект.

for(int i = 0; i < sizeOfList; i++) {
    list.get(i).equals(/* What you compare against */)
}

Также существует и другой синтаксис for:

for(Account a : accountList)

Вы можете поместить этот цикл в вспомогательный метод, который принимает Account и сравнивает его с каждым элементом.

Для упорядоченных списков у вас есть более эффективные параметры поиска, но вам нужно будет выполнить поиск независимо от того, что.

Ответ 3

ArrayList не сортирует содержащиеся элементы. Если вы хотите найти один элемент в ArrayList, вам нужно будет просмотреть список и сравнить их со значением, которое вы ищете.

Account foundAccount;
for(Account a : accountList){
  if(a.Id == targetID){
     foundAccount = a;
     break;
  }
}
if(foundAccount != null){
  //handle foundAccount
}
else{
  //not found
}

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

Вам нужно изучить интерфейс карты, в частности, реализацию HashMap. Это позволяет хранить каждый элемент в привязке к определенному ключу. Таким образом, вы можете поместить каждый из ваших объектов в HashMap с идентификатором в качестве ключа, а затем вы можете напрямую спросить HashMap, есть ли у него объект определенного ключа или нет.

Ответ 4

Вы должны использовать карту, например:

private Map<String, int> AccountMap;
for (String account : accounts )
             AccountMap.put(account, numberofid);

Ответ 5

Расширение ArrayList почти никогда не является хорошим решением вашей проблемы. Это базовая реализация Java List, которая позволяет хранить объекты в определенном порядке и извлекать их по их индексу.

Если вы хотите иметь возможность индексировать элементы с помощью уникального идентификатора, вы можете взглянуть на Map и его реализация HashMap.

Это может помочь вам решить вашу проблему, используя Map<Integer, Account>.

  • Вставка объектов: map.put(id, account) вместо list.add(account)
  • Извлечение объектов: map.get(id)

Это будет самая быстрая реализация. Но если вы не можете изменить это, вы можете выполнить итерацию через ArrayList и найти нужную учетную запись:

for (Account acc : accounts) {
  if (acc.getId() == yourId) {
    return acc;
  }
}
throw new NoSuchElementException();

Ответ 6

Лучший способ сделать это - использовать карту.

В вашем случае вы можете реализовать его следующим образом

    Map<account.getId(), account>

вы можете использовать метод get для получения соответствующего объекта учетной записи.

    accountMap.get(id);

Ответ 7

Простое решение:

Account account = accountList.stream().filter(a -> a.getId() == YOUR_ID).collect(Collectors.toList()).get(0);