0

リンクされたリストがあります。このリストの各位置 i に重み係数 p^i を設定したいと思います。次に、これらの要素の合計として、リストの要素の加重値を取得したいと考えています。

物事を具体化するために例を挙げましょう。リストのサイズが 5、つまりインデックス 0 からインデックス 4 までの要素があるとします。p = 0.5 (つまり、p = 1/2) とします。したがって、位置 0 の重み係数は p^0 = 1、位置 1 は p^1 = 0.5、位置 2 は p^2 = 0.25、位置 3 は p^3 = 0.125、最後に位置 4 です。 p^4 = 0.0625 です。

ここで、リストの 0 から 4 までに次の項目があるとします (これらの項目の ID を指定します)。4 | 5 | 4 | 5. したがって、ID = 4 のアイテムは位置 0、1、および 3 にあるため、その値はこれらの重み係数の合計、つまり p^0 + p^1 + p^3 = 1 + になります。 0.5 + 0.125 = 1.625。同様に、ID = 5 のアイテムの場合、p^2 + p^4 = 0.25 + 0.0625 = 0.3125 となります。

私の問題は次のとおりです: これらの要素 (ID 4 と ID 5) がリストにあるすべてのインデックスを取得して、これらの要素の値をこれらのインデックスの重み付け係数に関連付けられている合計として計算するにはどうすればよいですか? indexOf(Object o) は、指定された要素がリスト内で最初に出現するインデックスを返します。すべての要素のインデックスが必要です。なにか提案を?

編集:増加する代わりに、幾何学的に減少する合計に更新

リストに幾何学的に増加する合計 (window を呼び出し、タイプ Request のオブジェクトを受け取る) を幾何学的に減少する合計にする代わりに、コードを変更しました。私のコード (私のプログラムとまったく同じようにここに投稿します) は、リクエストの数が少ない場合 (たとえば、100 - メイン クラスのメイン メソッドでリクエストの数を設定します - のエントリポイント) は問題なく動作します。コード)。ただし、たとえば 1000 リクエストを使用すると、エラーが発生します。

    java.lang.IllegalArgumentException: n must be positive 

これは、コード内の別のポイントを指します。

if(reqToBeRemoved == null) {

    reqToBeRemoved = 
minKeyList.get((new Random(System.currentTimeMillis()).nextInt(minKeyList.size())));

} 

これが私のコードです。ここに投稿したものが役立つことを願っています(明らかに、コード全体をここに投稿することはできません。また、必須ではないと思います):

public void doWindowLookup(Request request) {

    int index = 0;
    double sum = 0;
    double initVal = 0;

    for(Request r : window) {

        if(r.equals(request)) {

            if(index == 0) {

                initVal = 1;

            }

            else {

                request.weight = Math.pow(p, index);
                sum += request.weight;

            }

            request.weightedWinFreq = initVal - sum;

        }

        index++;
    }

    logger.info("TEST: Item: " + request.reqID + " has weightedWinFreq: " +
                 request.getWeightedWinFreq());

}

このエラー メッセージは何を意味しますか? どの一般項目nが正でなければなりませんか??? random.nextInt() を呼び出すときにゼロ引数を渡すと仮定します (前のスレッドException in thread "main" java.lang.IllegalArgumentException: n must be positive で示されているように) が、引数がminKeyList.size()?

(私の質問にさらに説明が必要な場合は、必要な情報を提供するように依頼してください。)

編集:私の質問に対する以前の更新について:プログラムの別の部分で私のせいでした。回答済みと見なされる質問。

4

2 に答える 2

2

イテレータを使用する方が良い

    int n = 1;
    List<Integer> list = new LinkedList<Integer>(Arrays.asList(1, 2, 3, 1));
    ListIterator<Integer> it = list.listIterator();
    List<Integer> indexes = new ArrayList<Integer>();
    while (it.hasNext()) {
        if (it.next().equals(n)) {
            indexes.add(it.nextIndex() - 1);
        }
    }
    System.out.println(indexes);
于 2013-04-22T14:37:36.837 に答える
2

リストはいつでも手動でループできます。

double weight = 0.0;
Object target = new Integer(4);
int index = 1;
for (Object elem : linkedList) {
    if (elem.equals(target)) {
        weight += Math.pow(p, index);
    }
    index++;
}
于 2013-04-22T14:35:53.920 に答える