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 | 4 | 5 | 4 | 5.因此,由于ID=4的item在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 - 我在 Main 类的 main 方法中设置请求数 -编码)。但是,如果我使用例如 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() 时,我传递了一个零参数(如线程“main”中的前一个线程异常所示 java.lang.IllegalArgumentException: n must be positive),但这怎么可能,因为我的论点是minKeyList.size()?

(如果我的问题需要进一步澄清,请让我提供所需的信息。)

编辑:关于我的问题的先前更新:这是我在程序的另一部分的错。考虑回答的问题。

4

2 回答 2

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 回答
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 回答