0

私は現在、モデルを構築するWekaを使用して(Wekaに含まれているさまざまなモデルタイプの1つを使用して)プログラムを作成しています。私が問題を抱えているのは、プログラムが同じ機能に対して複数の型を使用できるようにしたいということです。たとえば、J48デシジョンツリーを使用することを選択した場合、タイプJ48の変数で関数を作成して呼び出す必要があります。一方、BayesNetを使用する場合は、BayesNetタイプの変数で同じ関数を作成して呼び出す必要があります。このモデルはプログラムのさまざまなポイントで使用する必要があるため、単純なif-elseチェーンでは使用できません。

基本的に私が必要としているのは、C++のvoidポインターに相当するものです。すべて同様の機能を実行できるさまざまなタイプを引き受けることができるもの。ジェネリックObjectクラスを使用してみましたが、正しいタイプにキャストできなかったことがわかりました(「互換性のないタイプ」エラーが発生しました)。

だから、私の質問の短いバージョンはこれです:JavaプログラマーはC ++プログラマーがvoidポインターで解決するであろう問題をどのように解決しますか?

ありがとう、-Morag

4

3 に答える 3

3

というか、こういうことですか?

public void doStuff(MyType<?> someObject) { }  

?は任意の型を表し、 を表しunbounded wildcardます。

このワイルドカードには特定の制限があることに注意してください。たとえば、 には何も追加できませんList<?>

詳細については、公式チュートリアルまたはAngelikaLanger Generics FAQを参照してください。

于 2012-07-04T18:20:59.757 に答える
0

Classifier各オブジェクトがClassifierなどのサブクラスになる場合でも、スーパークラスを任意の分類子オブジェクトの型宣言として使用できますJ48。それらはすべてスーパークラスの関数を実装しているため、関数呼び出しが定義されているため、使用している分類子の特定のタイプが必ずしもわかっていなくても機能します。Axcdnt の回答には、ポリモーフィズムに関する詳細へのリンクがあります。とにかく、次のコード スニペットを使用した作業プログラムがあります。彼らはあなたが必要としているように聞こえることを正確に行います。

Classifier Clfs = null;

    try {
        if (modelType.equals("J48")) {
            Clfs = new J48();
        } else if (modelType.equals("MLP")) {
            Clfs = new MultilayerPerceptron(); 
        } else if (modelType.equals("IB3")) {
            Clfs = new IBk(3);
        } else if (modelType.equals("RF")) {
            Clfs = new RandomForest(); 
        } else if (modelType.equals("NB")) {
            Clfs = new NaiveBayes();
//...

他の場所では、分類子をファイルに書き込んだ後、私が呼び出す

Classifier cls = (Classifier) weka.core.SerializationHelper.read(target);
prediction = cls.distributionForInstance(data.instance(0));

(targetは、モデルをロードするためのファイル パスを含む文字列です) ご覧のとおり、指定する必要がある作成時を除いて、使用している分類子の種類は問題ではありません。注: j48 は数値クラスを予測できないなど、まだいくつかの制限があります。

于 2012-07-06T04:06:32.453 に答える
0

現在、Weka を使用してモデルを構築するプログラムを作成しています (Weka に含まれるさまざまなモデル タイプのいずれかを使用)。私が問題を抱えている部分は、プログラムが同じ関数に複数の型を使用できるようにしたいということです。たとえば、J48 デシジョン ツリーの使用を選択した場合、J48 型の変数に対して関数を作成して呼び出す必要があります。一方、BayesNet を使用する場合は、BayesNet 型の変数に対して同じ関数をビルドして呼び出す必要があります。このモデルは、プログラムのさまざまなポイントで使用する必要があるため、単純な if-else チェーンでは機能しません

実際に必要なのは、ポリモーフィックな動作です。この投稿を確認してください。私はそれについて少し説明して答えました:ポリモーフィズム

ポリモーフィズムの背後にある考え方を理解したら、さらに深いところに進み、Factory パターンを探します。Java パターンの優れたリソースを次に示します。

ソース作りのパターン

ウィキペディア - 工場パターン

于 2012-07-04T19:10:59.900 に答える