我有一个链表。我想为此列表的每个位置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 |因此,由于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)返回列表中指定元素的第一个出现的索引,我需要所有出现的索引。有什么建议吗?
编辑:更新为几何减少的总和,而不是增加
我对我的代码做了一个修改,而不是在我的列表中有一个几何增加的总和(我称之为窗口并且采用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()时,我传递一个零参数(如前一个线程Exception in thread "main" java.lang.IllegalArgumentException: n must be positive所示),但这怎么可能,因为我的参数是minKeyList.size()?
(如果我的问题需要进一步澄清,请让我提供所需的信息。)
编辑:关于我的问题的先前更新:这是我的错误在该计划的另一部分。被认为应回答的问题。
答案 0 :(得分: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++;
}
答案 1 :(得分: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);