2

高価な計算があり、その結果をキャッシュしたいと考えています。2 つのキーでマップを作成する方法はありますか? みたいなことを考えていMap<(Thing1, Thing2), Integer>ます。

次に、次を確認できます。

if (! cache.contains(thing1, thing2)) {
  return computeResult();
}
else {
  return cache.getValue(thing1, thing2);
}

擬似コード。しかし、それらの線に沿った何か。

4

3 に答える 3

5

Thing1 と Thing2 を保持するクラスを作成する必要があります。

class Things {
    public final Thing1 thing1;
    public final Thing2 thing2;
    public Things(Thing1 thing1, Thing2 thing2) {
      this.thing1 = thing1; 
      this.thing2 = thing2;
    }
    @Override
    public boolean equals(Object obj) { ... }
    @Override
    public int hashCode() { ... };
 }

それを使用するには:

Things key = new Things(thing1, thing2);
if (!cache.contains(key) {
    Integer result = computeResult();
    cache.put(key, result);
    return result;
} else {
    return cache.getValue(key);
}

このコードを正しく機能させるには、equals と hashcode を実装する必要があることに注意してください。このコードをスレッドセーフにする必要がある場合は、ConcurrentHashMap を参照してください。

于 2009-10-12T02:28:15.503 に答える
3

メモ化が必要なようですね。Functional Javaの最新のトランク ヘッドにはP1、結果がキャッシュされる計算をモデル化する memoising プロダクト タイプがあります。

次のように使用します。

P1<Thing> myThing = new P1<Thing>() {
  public Thing _1() {
    return expensiveComputation();
  }
}.memo();

初めて _1() を呼び出すと、高価な計算が実行され、メモに保存されます。その後、代わりにメモが返されます。

「2 つのキー」の場合は、単純なペア タイプが必要です。Functional Java はこれも class の形で持っていますP2<A, B>。このような値を記憶するには、単純に を使用しますP1<P2<A, B>>

Promise<A>メモ化の代わりにクラスを使用することもできます。これはしばらくの間ライブラリにあったため、最新のバイナリが必要です。次のように使用します。

Promise<Thing> myThing =
  parModule(sequentialStrategy).promise(new P1<Thing>() {
    public Thing _1() {
      return expensiveComputation();
    }
  });

結果を取得するには、単に を呼び出しますmyThing.claim()また、結果がまだ準備できていない場合でも、Promise<A>関数を結果にマッピングするためのメソッドを提供します。

する必要がimport static fj.control.parallel.ParModule.parModuleありfj.control.parallel.Strategy.sequentialStrategyます。計算を独自のスレッドで実行する場合は、クラスsequentialStrategyによって提供される他の戦略のいずれかに置き換えます。Strategy

于 2009-10-12T02:38:51.800 に答える
2

Google Collectionsを使用する場合、そのMapMakerクラスには、makeComputingMap説明したことを正確に実行するメソッドがあります。無料のボーナスとして、スレッドセーフ (implements ConcurrentMap) でもあります。

2 つのキーについては、2 つのキーを含むクラスを作成し、必要な方法でキー比較を行うequalshashCode、および (該当する場合)の適切な実装を実装する必要があります。compareTo

于 2009-10-12T02:25:12.907 に答える