ArrayList按Id检索对象
假设我有一个自定义对象的ArrayList
,这非常简单。 例如:
class Account { public String Name; public Integer Id; }
我想在我的应用程序的许多部分中根据Id
参数检索特定的Account
对象。 最好的办法是什么?
我正在考虑扩展ArrayList
但我相信必须有更好的方法。
听起来你真正想要使用的是Map
,它允许你根据键检索值。 如果您坚持使用ArrayList
,您唯一的选择是遍历整个列表并搜索该对象。
就像是:
for(Account account : accountsList) { if(account.getId().equals(someId) { //found it! } }
与
accountsMap.get(someId)
这种操作在Map
是O(1)
,在List
中是O(n)
。
我正在考虑扩展ArrayList,但我相信必须有更好的方法。
一般来说,这是糟糕的设计。 阅读有效的Java第16项,以便更好地理解原因 – 或查看本文 。
假设它是一个无序列表,您将需要遍历列表并检查每个对象。
for(int i = 0; i < sizeOfList; i++) { list.get(i).equals(/* What you compare against */) }
还有另一种语法:
for(Account a : accountList)
您可以将此循环放入一个辅助方法,该方法接受一个Account
并将其与每个项目进行比较。
对于有序列表,您可以获得更高效的搜索选项,但无论如何都需要实施搜索。
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作为键,然后您可以直接询问HashMap是否具有某个键的对象。
您必须使用Map例如:
private Map AccountMap; for (String account : accounts ) AccountMap.put(account, numberofid);
扩展ArrayList
几乎不是解决问题的好方法。 这是List
的基本Java实现,它允许您按特定顺序存储对象,并通过索引检索它们。
如果您希望能够使用唯一标识符索引元素,您可以查看Map
及其实现HashMap
。
它可以帮助您解决您的问题,使用Map
。
- 插入对象:
map.put(id, account)
而不是list.add(account)
- 检索对象:
map.get(id)
这将是最快的实施。 但是,如果你不能改变它,你仍然可以迭代你的ArrayList
并找到合适的帐户:
for (Account acc : accounts) { if (acc.getId() == yourId) { return acc; } } throw new NoSuchElementException();
更好的方法是使用Map。
在您的情况下,您可以通过以下方式实现它
Map
您可以使用“get”方法来检索相应的帐户对象。
accountMap.get(id);