非常にArrayList<Account>
単純なカスタム オブジェクトがあるとします。例えば:
class Account
{
public String Name;
public Integer Id;
}
アプリケーションの多くの部分でAccount
、パラメーターに基づいて特定のオブジェクトを取得したいと考えています。Id
これについて最善の方法は何ですか?
拡張することを考えてArrayList
いましたが、もっと良い方法があるに違いないと確信しています。
非常にArrayList<Account>
単純なカスタム オブジェクトがあるとします。例えば:
class Account
{
public String Name;
public Integer Id;
}
アプリケーションの多くの部分でAccount
、パラメーターに基づいて特定のオブジェクトを取得したいと考えています。Id
これについて最善の方法は何ですか?
拡張することを考えてArrayList
いましたが、もっと良い方法があるに違いないと確信しています。
本当に使いたいのは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 Item 16 をお読みください。または、この記事をご覧ください。
これを行うより良い方法は、Map を使用することです。
あなたの場合、次の方法で実装できます
Map<account.getId(), account>
「get」メソッドを使用して、適切なアカウント オブジェクトを取得できます。
accountMap.get(id);
拡張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();