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);