2

ですから、私はあらゆる意図と目的のために、ベクトルパラメータ用のC++のSTLアルゴリズムinner_productのJavaバージョンを自分で実現しようとしています。これまでのところ、私のコード(おそらく根本的に間違っています)は次のようになります:

public static<T,K> double inner_product(Vector<T> v1, Vector<K> v2)
{
    double isum = 0;
    for(int i=0;i<v1.size()&&i<v2.size();i++)
    {
        isum+=v1.elementAt(i)*v2.elementAt(i);
    }

    return isum;
}

問題は、演算子*がタイプT、Kに対して定義されていないことです。ただし、これまでの私の知識では、Javaでも不可能であるとはいえ、演算子の事前定義については説明していません。ジェネリックスを取る機能を実現する方法で助けていただければ幸いです。前もって感謝します。

4

3 に答える 3

3

2つの理由から、これを行うための良い方法はありません。

  1. タイプパラメータ(TK)は、プリミティブではなく、オブジェクトタイプを参照する必要があります。
  2. Javaには演算子のオーバーロードはありません。

あなたが得ることができる最も近いものはこのようなものです(モジュロ構文エラー、私のジェネリックは錆びています):

public static<T extends Number,K extends Number> double inner_product(Vector<T> v1, Vector<K> v2)
{
    double isum = 0;
    for(int i=0;i<v1.size()&&i<v2.size();i++)
    {
        isum+=v1.elementAt(i).doubleValue()*v2.elementAt(i).doubleValue();
    }

    return isum;
}

これは、プリミティブ型のオブジェクトラッパーで機能しますが、機能しDoubleませんdouble

また、あなたのバージョンと同様に、これdoubleは渡された型に関係なく返されます。また、型消去のため、これを修正するのはかなり困難です。

于 2012-05-06T07:23:26.297 に答える
2

Tには、次のように定義されたメソッドが必要mutliplyです。これにより、Vで呼び出すことができます。

interface T {
    double multiply(V v);
}

public static<T,K> double inner_product(Vector<T> v1, Vector<K> v2) {
    double isum = 0;
    for(int i=0; i<v1.size() && i<v2.size(); i++) {
        isum += v1.elementAt(i).multiply(v2.elementAt(i));
    }
    return isum;
}

1998年にJava1.2コレクションライブラリのListに取って代わられたIMHOVector。Listを使用する方が良い選択かもしれません。

あなたは本当にそれがジェネリックである必要がありますか?ダブルを使うだけです

public static double inner_product(List<Double> v1, List<Double> v2) {
    double isum = 0;
    for(int i=0; i<v1.size() && i<v2.size(); i++) 
        isum += v1.get(i) * v2.get(i);

    return isum;
}

または効率を上げるには、double[]またはTDoubleArrayListを使用します

public static double inner_product(double[] v1, double[] v2) {
    double isum = 0;
    for(int i=0; i<v1.size() && i<v2.size(); i++) 
        isum += v1[i] * v2[i];

    return isum;
}
于 2012-05-06T07:19:24.220 に答える
1

Javaには演算子のオーバーロードはなく、乗算演算子は数値プリミティブ型にのみ適用されます。ジェネリック型でこれを行う必要がある場合は、それらをdoubleに変換できるインターフェイスを実装するようにする必要があります。

public interface DoubleProvider
    double getDouble();
}

次に、次のメソッドを定義できます。

public static <T extends DoubleProvider, K extends DoubleProvider> double innerProduct(Iterable<T> v1, Iterable<K> v2) {
    Iterator<T> it1 = v1.iterator();
    Iterator<K> it2 = v2.iterator();
    double sum = 0D;
    while (it1.hasNext() && it2.hasNext()) {
        T t = it1.next();
        K k = it2.next();
        sum += t.getDouble() * k.getDouble();
    }
    return sum;
}

私のコードに注目してください

  • Javaの命名規則を尊重します
  • 廃止されたVector(Java 1.2以降は使用されない)だけでなく、あらゆる種類のIterableを受け入れます
于 2012-05-06T07:25:14.370 に答える