【问题标题】:ArrayList Retrieve object by IdArrayList 按 Id 检索对象
【发布时间】:2013-11-15 11:08:35
【问题描述】:

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

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

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

我正在考虑扩展ArrayList,但我相信一定有更好的方法。

【问题讨论】:

  • 使用Map 或遍历ArrayList 中的所有元素。
  • 使用 map (HasMap) 或 set(HashSet) 代替

标签: java collections arraylist


【解决方案1】:

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

类似:

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

accountsMap.get(someId)

这种操作是O(1)Map 中,而O(n)List 中。

我正在考虑扩展 ArrayList,但我确信一定有 更好的方法。

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

【讨论】:

  • 只有基于散列的地图才能为您提供O(1) 查找。
【解决方案2】:

Java 解决方案:

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

Kotlin 解决方案 1:

val index = accountList.indexOfFirst { it.id == YOUR_ID }
val account = accountList[index]

Kotlin 解决方案 2:

val account = accountList.first { it.id == YOUR_ID }

【讨论】:

    【解决方案3】:

    更好的方法是使用地图。

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

        Map<account.getId(), account>
    

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

        accountMap.get(id);
    

    【讨论】:

      【解决方案4】:

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

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

      还有其他 for 语法:

      for(Account a : accountList)
      

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

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

      【讨论】:

        【解决方案5】:

        您必须使用地图例如:

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

        【讨论】:

          【解决方案6】:

          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为key,然后你可以直接询问HashMap是否有某个key的对象。

          【讨论】:

            【解决方案7】:

            扩展ArrayList 几乎不是解决问题的好方法。这是List 的基本Java 实现,它允许您按特定顺序存储对象,并通过索引检索它们。

            如果您希望能够使用唯一标识符对元素进行索引,您可以查看Map 及其实现HashMap

            使用Map&lt;Integer, Account&gt; 可以帮助您解决问题。

            • 插入对象:map.put(id, account) 而不是list.add(account)
            • 检索对象:map.get(id)

            这将是最快的实现。但是,如果您无法更改此设置,您仍然可以遍历您的 ArrayList 并找到正确的帐户:

            for (Account acc : accounts) {
              if (acc.getId() == yourId) {
                return acc;
              }
            }
            throw new NoSuchElementException();
            

            【讨论】:

              猜你喜欢
              • 2014-01-26
              • 2017-06-06
              • 1970-01-01
              • 2016-04-01
              • 1970-01-01
              • 1970-01-01
              • 2016-10-30
              • 2020-05-06
              • 1970-01-01
              相关资源
              最近更新 更多