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) 

这种操作在MapO(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);