假设我有一个非常简单的我自定义对象的ArrayList<Account>
。例如:ArrayList通过Id检索对象
class Account
{
public String Name;
public Integer Id;
}
我想根据我的应用程序的很多地方Id
参数来检索特定Account
对象。什么是最好的方式去做这件事?
我想扩展ArrayList
,但我确定必须有更好的方法。
假设我有一个非常简单的我自定义对象的ArrayList<Account>
。例如:ArrayList通过Id检索对象
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)
这种操作是O(1)
在Map
,VS O(n)
在List
。
我在想扩展ArrayList,但我确信必须有 更好的方法。
一般来说,这是糟糕的设计。请阅读Effective Java第16项,以便更好地理解为什么 - 或查看此article。
只有基于散列的地图才会给你'O(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是否具有某个键的对象。
假设它是一个无序列表,您需要迭代列表并检查每个对象。
for(int i = 0; i < sizeOfList; i++) {
list.get(i).equals(/* What you compare against */)
}
还有其他for
语法:
for(Account a : accountList)
你可以把这个循环到接受一个Account
,并确定它的每个项目一个辅助方法。
对于有序列表,您可以使用更高效的搜索选项,但无论如何您都需要执行搜索。
必须使用地图,例如:
private Map<String, int> AccountMap;
for (String account : accounts)
AccountMap.put(account, numberofid);
扩展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();
一个更好的办法来做到这一点是使用地图。
在你的情况,你可以通过以下方式
Map<account.getId(), account>
您可以使用“get”方法来检索适当的帐户对象实现它。
accountMap.get(id);
使用Map或迭代ArrayList中的所有元素。 –
使用map(HasMap)或set(HashSet)代替 – wxyz