24

非常にArrayList<Account>単純なカスタム オブジェクトがあるとします。例えば:

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

アプリケーションの多くの部分でAccount、パラメーターに基づいて特定のオブジェクトを取得したいと考えています。Idこれについて最善の方法は何ですか?

拡張することを考えてArrayListいましたが、もっと良い方法があるに違いないと確信しています。

4

7 に答える 7

34

本当に使いたいのはMap、キーに基づいて値を取得できる のようです。に固執する場合ArrayList、唯一のオプションは、リスト全体を反復処理してオブジェクトを検索することです。

何かのようなもの:

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

accountsMap.get(someId)

この種の操作はO(1)MapO(n)にありListます。

ArrayList を拡張することを考えていましたが、もっと良い方法があるはずです。

一般的に言えば、これは貧弱な設計です。その理由をよりよく理解するには、Effective Java Item 16 をお読みください。または、この記事をご覧ください

于 2013-11-04T18:22:37.323 に答える
3

これを行うより良い方法は、Map を使用することです。

あなたの場合、次の方法で実装できます

    Map<account.getId(), account>

「get」メソッドを使用して、適切なアカウント オブジェクトを取得できます。

    accountMap.get(id);
于 2013-11-04T18:29:48.533 に答える
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 に答える