Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList按Id检索对象_Java_Collections_Arraylist - Fatal编程技术网

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)
查找。