24

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

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

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

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

4

7 回答 7

34

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

就像是:

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

相对

accountsMap.get(someId)

这种操作O(1)在 a 中Map,对O(n)在 a 中List

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

一般来说,这是糟糕的设计。阅读Effective Java Item 16 以更好地理解原因 - 或查看本文

于 2013-11-04T18:22:37.323 回答
6

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 }
于 2019-10-02T13:58:45.937 回答
3

更好的方法是使用 Map。

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

    Map<account.getId(), account>

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

    accountMap.get(id);
于 2013-11-04T18:29:48.533 回答
2

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

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

还有其他for语法:

for(Account a : accountList)

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

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

于 2013-11-04T18:26:46.850 回答
2

您必须使用地图,例如:

private Map<String, int> AccountMap;
for (String account : accounts )
             AccountMap.put(account, numberofid);
于 2013-11-04T18:27:10.843 回答
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为key,然后你可以直接询问HashMap是否有某个key的对象。

于 2013-11-04T18:26:02.327 回答
1

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

如果您希望能够使用唯一标识符对元素进行索引,您可以查看一下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();
于 2013-11-04T18:27:41.083 回答