Java ArrayList按Id检索对象
假设我有一个非常简单的自定义对象的Java ArrayList按Id检索对象,java,collections,arraylist,Java,Collections,Arraylist,假设我有一个非常简单的自定义对象的ArrayList。例如: class Account { public String Name; public Integer Id; } private Map<String, int> AccountMap; for (String account : accounts ) AccountMap.put(account, numberofid); 我想根据应用程序许多部分中的Id参数检索特定的Account对象。最
ArrayList
。例如:
class Account
{
public String Name;
public Integer Id;
}
private Map<String, int> AccountMap;
for (String account : accounts )
AccountMap.put(account, numberofid);
我想根据应用程序许多部分中的Id
参数检索特定的Account
对象。最好的办法是什么
我正在考虑扩展
ArrayList
,但我相信一定有更好的方法。听起来您真正想要使用的是映射,它允许您根据键检索值。如果您坚持使用ArrayList
,您唯一的选择就是遍历整个列表并搜索对象
比如:
for(Account account : accountsList) {
if(account.getId().equals(someId) {
//found it!
}
}
对
accountsMap.get(someId)
这种操作在映射中是O(1)
,而在列表中是O(n)
我正在考虑扩展ArrayList,但我相信一定会有
更好的方法
一般来说,这是一个糟糕的设计。阅读第16项以更好地了解原因,或者查看此项。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实现。这使您可以将每个元素按绑定到某个键的顺序存储。因此,您可以将每个对象放置在一个以Id为键的HashMap中,然后您可以直接询问HashMap是否具有某个键的对象。假设它是一个无序列表,您需要在列表上迭代并检查每个对象
for(int i = 0; i < sizeOfList; i++) {
list.get(i).equals(/* What you compare against */)
}
您可以将此循环放入一个helper方法中,该方法采用帐户
,并将其与每个项目进行比较
对于有序列表,您有更高效的搜索选项,但无论如何都需要执行搜索。您必须使用地图,例如:
class Account
{
public String Name;
public Integer Id;
}
private Map<String, int> AccountMap;
for (String account : accounts )
AccountMap.put(account, numberofid);
私有地图账户地图;
for(字符串帐户:帐户)
AccountMap.put(account,numberofid);
扩展ArrayList
几乎从来都不是解决问题的好办法。这是列表
的基本Java实现,它允许您按特定顺序存储对象,并按其索引检索对象
如果您希望能够使用唯一标识符对元素进行索引,您可以查看它的名称和实现
通过使用地图
,它可以帮助您解决问题
- 插入对象:
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>
简单解决方案:
Account account = accountList.stream().filter(a -> a.getId() == YOUR_ID).collect(Collectors.toList()).get(0);
使用Map
或迭代ArrayList
中的所有元素。使用Map(HasMap)或set(HashSet)代替,只有基于哈希的映射才能提供O(1)
查找。