6

コレクションのようなツリーを開発している問題を考えてみましょう。

コレクションの主な機能の 1 つは、格納されているすべてのアイテムを 1 つずつトレースし、特定の基準が満たされるまで各アイテムに対して特定の関数を呼び出すことです(遅延コレクション)。

したがって、関数には次のシグネチャが必要です。

void Trace(function func, criteria crit)
{
    item i = firstItem();
    while (i != endItem())
    {
        i = nextItem();
        func(i);
        if (crit(i))
            return;
    }
}

in関数ポインタはおよびC++に使用できます。 では、キーワードはまさにこの問題の解決策だと思います。funccrit
C#yield

Javaで同じことを取得するにはどうすればよいですか?

4

4 に答える 4

2

Java では、適用可能な関数を実装するクラスのオブジェクトへの参照を渡すか、代わりに Commons Collections を使用します。

  • Predicateパーツの実装を使用しcritます。
  • Closureパーツの実装を使用しfuncます。

例えば:

Closure c = new Closure() {
    public void execute(Object obj) {
        ...
    }
};

Predicate p = new Predicate() {
    public boolean evaluate(Object obj) {
        ...
    }
}

Trace(c, p);
于 2012-12-28T01:34:28.673 に答える
2

ここで探しているのは、Strategyデザイン パターンです。

このパターンの目標は、アルゴリズムの実装を Strategy オブジェクトに抽象化することです。ここで、アルゴリズムは、渡したい関数funcと関数です。crit

したがって、次のようなインターフェイスが必要になりますTraceStrategy。次に、このインターフェイスの実装をコレクションに渡します。あなたのコードは次のようになります

void Trace(TraceStrategy traceStrategy)
{
    item i = firstItem();
    while (i != endItem())
    {
        i = nextItem();
        traceStrategy.func(i);
        if (traceStrategy.crit(i))
            return;
    }
}

interface TraceStrategy {
   public boolean crit(item i);

   public void func(item i);
}

縛られないように、おそらくこれをジェネリックにしたいと思うでしょうitem...しかし、アイデアはわかります。

于 2012-12-28T01:35:35.880 に答える
1

メソッドを宣言するインターフェイスを作成し、インターフェイスを実装するオブジェクトへの参照を引数として必要とします。呼び出し元は、匿名の内部クラスを使用してオブジェクトを作成できます。

于 2012-12-28T01:34:00.907 に答える
1

traceいくつかの手法を組み合わせることで、Java でこの関数を適切に機能させることができます。

  • 「関数ポインター」の代わりに、パラメーターfunccrit特定のインターフェイスを実装するオブジェクト インスタンスにする必要があります。次に、オブジェクトのこのインターフェイスで関数を呼び出すことができますi。実際、これは 2 つの異なるビスタ パラメータを持つビスタ パターンです。
  • また、ツリーをトラバースする方法も必要です。を実装できますIterator- これにより、構造全体をトラバースする優れた方法が得られます。または、再帰的にすることもできますtrace(ツリーの左右の枝で自分自身を呼び出します) と、反復子は必要ありません。

イテレータのバージョンは次のようになります。

public void trace(IFunction func, ICriteria crit) {
    for (T i: this) {
        func.call(i);
        if (crit.test(i)) return;
    }
}

Tコレクションの項目タイプを次に示します。callおよびはそれぞれおよびインターフェイスtestの関数定義です。IFunctionICriteria

于 2012-12-28T01:38:52.477 に答える