如何在Java中获取链表中元素的所有索引

如何在Java中获取链表中元素的所有索引,java,linked-list,Java,Linked List,我有一个链表。我想为列表中的每个位置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 |

我有一个链表。我想为列表中的每个位置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的项目位于位置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

我的问题是:如何获取列表中这些元素(ID4和ID5)所在的所有索引,以便将这些元素的值计算为与这些索引相关的权重因子的总和?indexOf(对象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())));

} 
这是我的代码,我希望我在这里发布的内容是有用的(显然我不能在这里发布全部代码,我想这也不是必需的):

此错误消息的含义是什么?哪个一般项目n应该是正的???我假设在调用random.nextInt()时传递了一个零参数(如前一个线程所示),但这怎么可能呢,因为我的参数是minKeyList.size()

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


编辑:关于我问题的上一次更新:是我在程序的另一部分出了错。已考虑回答的问题。

您始终可以手动循环浏览列表:

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++;
}

您始终可以手动循环浏览列表:

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++;
}

最好使用迭代器

    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);
int n=1;
列表=新的LinkedList(Arrays.asList(1,2,3,1));
ListIterator it=list.ListIterator();
列表索引=新的ArrayList();
while(it.hasNext()){
如果(it.next()等于(n)){
index.add(it.nextIndex()-1);
}
}
System.out.println(索引);

最好使用迭代器

    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);
int n=1;
列表=新的LinkedList(Arrays.asList(1,2,3,1));
ListIterator it=list.ListIterator();
列表索引=新的ArrayList();
while(it.hasNext()){
如果(it.next()等于(n)){
index.add(it.nextIndex()-1);
}
}
System.out.println(索引);

迭代和更新临时总和如何。迭代所有元素后,您将得到最终的和。@baraky:我可以迭代以设置每个位置的权重因子-实际上我是这样做的:for(int I=0;I等于
?我认为它应该是
weight+=elem*Math.pow(p,I)
@torquestomp:代码除了一个细节之外都可以工作-当然,可能是我的错,我是如何将代码集成到程序中的。不管怎样,让我解释一下。我的列表中有ID为5 | 2 | 1 | 5的项目。我使用零(0)作为索引的起始值。因此,对于第5项,我应该在循环后有一个权重1+0.125=1.125。但是,代码给出了2.125。因此,它执行以下操作:第一次为索引0取值1,然后再次为索引0取值1,为索引4取值0.125,并将所有值相加(我假设)。让我换一种方式说。最初,列表是空的。它被插入到索引0处的项目5的列表中。它的值是1。然后将项目2插入到索引0处的列表中,项目5在索引1处右移。因此,现在项目2的值为1,项目5的值为0.5。等等因此,在最后,位于索引0和4的项目5的值为1+0.125=1.125,位于索引1的项目2的值为0.5,位于索引3的项目1的值为0.25。@Torguetomp:I foun