1

ええ、私は以下でやろうとしていることを行うためのよりエレガントな方法があるかどうかを確認しようとしています (この問題はJ2ME に関連しているため、Java 1.5 以降でしか見られない Generics や最新のデータ構造はありません):

サーバーへのネットワーク呼び出しからデータが入力される単純な Bean オブジェクトである MyImage オブジェクトがあるとします。含まれているのは、アプリに関連する画像に関するメタデータだけです。さらに重要なのは、そのオブジェクトのサーバーから画像を取得するために URL を構築するために使用される一意の識別子が含まれていることです。それらのオブジェクトを要求すると、それらのオブジェクトの新しいセットを頻繁に受け取ります。そのうちのいくつかは以前の要求と同じです。

ここで、画像をダウンロードできたとしても、新しい MyImage オブジェクトのセットを受け取ったときにそれらをキャッシュに対して相互参照し、画像のみを保持するように画像データをキャッシュする方法に問題が生じます。その MyImage オブジェクトが既にダウンロードされている場合。つまり、ダウンロードした画像を Hashtable キャッシュに保存するときに、構築された URL (MY_IMAGE_SERVER+myImageUniqueId) を使用して画像データをキーにします。MyImage オブジェクトの新しいセットを取得すると、現在、次のことを行います。

 Hashtable imgs = getImages();

 //If we have cached images, we should see which ones to carry over.
 if(imgs.size() > 0){       
    Hashtable newImgs = new Hashtable();
    for(int i = 0; i < myImages.length; i++){
        MyImage mi = myImages[i];
        if(mi != null && mi.hasImage()){
            //Check if we have the MD5 URL
            if(imgs.containsKey(IMG_URL_PATH + mi.getUniqueId())){
                //Place in new hashtable
                newImgs.put(IMG_URL_PATH + mi.getUniqueId(), imgs.get(IMG_URL_PATH + mi.getUniqueId()));
            }
        }
    }
   _bannerImgs = newImgs;
 }

これは正当に聞こえるのか、それともより効率的な方法で実行できるのか疑問に思っています。

4

2 に答える 2

0

ファローアップ

コメント (以下) のコードの想定される目的に基づいて、あなたのやり方は合理的に見えますが、いくつかのマイナーな最適化を行うことができます。コードの関連部分を次のように変更します。

    // Check if we have the image in our cache
    String key = IMG_URL_PATH + mi.getUniqueId();
    Object image = imgs.get(key);
    if (image != null) {
        // Carry over to new cache
        newImgs.put(key, image);
    }

ノート:

  1. ローカル変数を作成/使用すると、キー文字列の作成が 3 回回避されます。
  2. getの代わりに使用すると、 contains1 つのハッシュテーブル ルックアップが不要になります。

ただし、これがシステムのパフォーマンスに大きな違いをもたらすかどうかは疑わしいです...getUniqueId()メソッドを呼び出すたびにMD5合計を計算するなど、メソッドが何かばかげたことをしない限り。(そして、どうやらそうではありません。)

パフォーマンスにもかかわらず、コードが読みやすくなるため、この変更を行います... IMO。

于 2011-02-08T00:26:26.643 に答える
-1

保持する画像のキーを含むセットが既にある場合は、次のように簡単に実行できます。

imgs.keySet().retainAll(stillValidKeys);

ただし、リストしかない場合は、現在のコードでおそらく十分です。

于 2011-02-08T03:46:33.337 に答える