ArrayList按Id检索对象

时间:2013-11-04 18:19:32

标签: java collections arraylist

假设我有一个ArrayList<Account>我的自定义对象非常简单。例如:

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

我想在应用程序的许多部分中根据Account参数检索特定的Id对象。什么是最好的解决方法?

我在考虑延长ArrayList,但我相信一定有更好的方法。

7 个答案:

答案 0 :(得分:23)

听起来您真正想要使用的是Map,它允许您根据键检索值。如果你坚持ArrayList,你唯一的选择就是遍历整个列表并搜索对象。

类似的东西:

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

accountsMap.get(someId)

O(1)中的MapO(n)中的List相比,此类操作为{{1}}。

  

我正在考虑扩展ArrayList,但我确信必须有   更好的方式。

一般来说,这是糟糕的设计。阅读Effective Java第16项,以便更好地了解原因 - 或查看此article

答案 1 :(得分:2)

假设它是一个无序列表,您需要遍历列表并检查每个对象。

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

还有其他for语法:

for(Account a : accountList)

您可以将此循环放入一个带有Account的辅助方法,并将其与每个项目进行比较。

对于有序列表,您可以获得更高效的搜索选项,但无论如何都需要实施搜索。

答案 2 :(得分:1)

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是否有某个键的对象。

答案 3 :(得分:1)

您必须使用地图例如:

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

答案 4 :(得分:1)

扩展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();

答案 5 :(得分:1)

更好的方法是使用Map。

在您的情况下,您可以通过以下方式实现它

    Map<account.getId(), account>

您可以使用“get”方法检索相应的帐户对象。

    accountMap.get(id);

答案 6 :(得分:1)

简单解决方案:

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