ArrayList 按 Id 检索对象
Posted
技术标签:
【中文标题】ArrayList 按 Id 检索对象【英文标题】:ArrayList Retrieve object by Id 【发布时间】:2013-11-15 11:08:35 【问题描述】:假设我有一个自定义对象的ArrayList<Account>
,这非常简单。例如:
class Account
public String Name;
public Integer Id;
我想在我的应用程序的许多部分根据Id
参数检索特定的Account
对象。最好的解决方法是什么?
我正在考虑扩展ArrayList
,但我相信一定有更好的方法。
【问题讨论】:
使用Map
或遍历ArrayList
中的所有元素。
使用 map (HasMap) 或 set(HashSet) 代替
【参考方案1】:
听起来您真正想要使用的是Map
,它允许您根据键检索值。如果您坚持使用ArrayList
,您唯一的选择是遍历整个列表并搜索对象。
类似:
for(Account account : accountsList)
if(account.getId().equals(someId)
//found it!
对
accountsMap.get(someId)
这种操作是O(1)
在Map
中,而O(n)
在List
中。
我正在考虑扩展 ArrayList,但我确信一定有 更好的方法。
一般来说,这是糟糕的设计。阅读 Effective Java 第 16 条以更好地了解原因 - 或查看此 article。
【讨论】:
只有基于散列的地图才能为您提供O(1)
查找。【参考方案2】:
Java 解决方案:
Account account = accountList.stream().filter(a -> a.getId() == YOUR_ID).collect(Collectors.toList()).get(0);
Kotlin 解决方案 1:
val index = accountList.indexOfFirst it.id == YOUR_ID
val account = accountList[index]
Kotlin 解决方案 2:
val account = accountList.first it.id == YOUR_ID
【讨论】:
【参考方案3】:更好的方法是使用地图。
在您的情况下,您可以通过以下方式实现它
Map<account.getId(), account>
您可以使用“get”方法来检索适当的帐户对象。
accountMap.get(id);
【讨论】:
【参考方案4】:假设它是一个无序列表,您将需要遍历该列表并检查每个对象。
for(int i = 0; i < sizeOfList; i++)
list.get(i).equals(/* What you compare against */)
还有其他 for
语法:
for(Account a : accountList)
您可以将此循环放入一个辅助方法中,该方法接受 Account
并将其与每个项目进行比较。
对于有序列表,您有更高效的搜索选项,但无论如何您都需要实现搜索。
【讨论】:
【参考方案5】:您必须使用地图例如:
private Map<String, int> AccountMap;
for (String account : accounts )
AccountMap.put(account, numberofid);
【讨论】:
【参考方案6】:ArrayList 不对包含的元素进行排序。如果您想在 ArrayList 中查找单个元素,则需要遍历列表并将每个元素与您要查找的值进行比较。
Account foundAccount;
for(Account a : accountList)
if(a.Id == targetID)
foundAccount = a;
break;
if(foundAccount != null)
//handle foundAccount
else
//not found
或者,您可以使用更智能的数据结构,对数据进行排序并保持信息的连续性。
您需要研究 Map 接口,特别是 HashMap 实现。这使您可以按与某个键相关的顺序存储每个元素。所以你可以把你的每一个对象放在一个HashMap中,以Id为key,然后你可以直接询问HashMap是否有某个key的对象。
【讨论】:
【参考方案7】:扩展ArrayList
几乎不是解决问题的好方法。这是List
的基本Java 实现,它允许您按特定顺序存储对象,并通过索引检索它们。
如果您希望能够使用唯一标识符对元素进行索引,您可以查看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();
【讨论】:
以上是关于ArrayList 按 Id 检索对象的主要内容,如果未能解决你的问题,请参考以下文章
在 Java 8 中使用 Lambda 对 ArrayList 进行排序