2013-11-04 91 views
8

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

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

我想根据我的应用程序的很多地方Id参数来检索特定Account对象。什么是最好的方式去做这件事?

我想扩展ArrayList,但我确定必须有更好的方法。

+5

使用Map或迭代ArrayList中的所有元素。 –

+0

使用map(HasMap)或set(HashSet)代替 – wxyz

回答

12

这听起来像你真正想使用的是Map,它允许你检索基于密钥的值。如果你坚持ArrayList,你唯一的选择是遍历整个列表并搜索对象。

喜欢的东西:

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

accountsMap.get(someId) 

这种操作是O(1)Map,VS O(n)List

我在想扩展ArrayList,但我确信必须有 更好的方法。

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

+2

只有基于散列的地图才会给你'O(1)'查找。 –

+0

我同意,很好的评论 –

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

2

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

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

还有其他for语法:

for(Account a : accountList) 

你可以把这个循环到接受一个Account,并确定它的每个项目一个辅助方法。

对于有序列表,您可以使用更高效的搜索选项,但无论如何您都需要执行搜索。

1

必须使用地图,例如:

private Map<String, int> AccountMap; 
for (String account : accounts) 
      AccountMap.put(account, numberofid); 
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(); 
1

一个更好的办法来做到这一点是使用地图。

在你的情况,你可以通过以下方式

Map<account.getId(), account> 

您可以使用“get”方法来检索适当的帐户对象实现它。

accountMap.get(id);