Java 如何在从ArrayList中删除对象时继续迭代ArrayList

Java 如何在从ArrayList中删除对象时继续迭代ArrayList,java,arraylist,Java,Arraylist,为了尝试在Java中实现银行家算法,我尝试遍历存储多个线程id的ArrayList。我希望不断迭代这个数组,直到找到一个安全序列(或者不找到)。到目前为止,我只能遍历ArrayList一次,但是如果我发现对象是我的安全序列中的下一个对象,我需要将它们作为iterate删除 当我从ArrayList(或任何其他数据结构)中删除对象时,如何以循环方式不断迭代?我希望我的问题足够清楚,但以下是我迄今为止的情况: 在最佳情况下,当列表中剩下0个对象时,算法停止 编辑 我所说的循环方式的意思是:0,1,2

为了尝试在Java中实现银行家算法,我尝试遍历存储多个线程id的ArrayList。我希望不断迭代这个数组,直到找到一个安全序列(或者不找到)。到目前为止,我只能遍历ArrayList一次,但是如果我发现对象是我的安全序列中的下一个对象,我需要将它们作为iterate删除

当我从ArrayList(或任何其他数据结构)中删除对象时,如何以循环方式不断迭代?我希望我的问题足够清楚,但以下是我迄今为止的情况: 在最佳情况下,当列表中剩下0个对象时,算法停止

编辑 我所说的循环方式的意思是:0,1,2,3,4,0,1,2,3,4(我还需要能够从列表中删除进程,因此迭代应该变小。)可能类似于:注意,当列表中剩余0时,algo停止

0,1,2,3,4

,0,2,3,4

2,3,4

2,4

四,

while(it.hasNext()){
整数thisOne=it.next();
发现=错误;
//此过程可以从列表中删除
//因为cN=它当前的需求
//a=已分配进程的数量
//cR=银行的现有资源

//因此,如果cN-a没有真正得到你的“发现”条件应该做的,但是这里有一个方法

    //todo  create loop condition for stopping, eg originalList.size() > 0
    //eg
    List<Integer> itemsToRemoveList = new ArrayList<Integer>();
    while (originalList.size() > 0) { 
       Iterator it = originalList.iterator();      

       while (it.hasNext()) {
          Integer thisOne = it.next();
          found=false;
          // this process, can be removed from the list
          if(noDeficit(cN[thisOne], a[thisOne], cR)){

              // we take away its resources and give them to the bank
              Utility.add(cR, a[thisOne]);
              Utility.zeroOut(cN[thisOne]);
              Utility.zeroOut(a[thisOne]);

              // we remove it from the list of processes 
              itemsToRemoveList.add(thisOne);
           }                                   
        } //end loop

        for (Integer integerToRemove : itemsToRemoveList) {  
           originalList.remove(integerToRemove);
        }
        itemsToRemoveList.clear();

   }
//todo为停止创建循环条件,例如originalList.size()>0
//乙二醇
List itemsToRemoveList=新建ArrayList();
而(originalList.size()>0){
迭代器it=originalList.Iterator();
while(it.hasNext()){
整数thisOne=it.next();
发现=错误;
//此过程可以从列表中删除
if(noDeficit(cN[thisOne],a[thisOne],cR)){
//我们拿走它的资源,把它们交给银行
添加(cR,a[thisOne]);
效用归零(cN[thisOne]);
实用性归零(a[thisOne]);
//我们将其从进程列表中删除
itemsToRemoveList.add(此项);
}                                   
}//结束循环
对于(Integer integerToRemove:itemsToRemoveList){
原始列表删除(整数删除);
}
itemsToRemoveList.clear();
}

如果(!found)返回false;
表示将继续从列表中删除第一个值,直到
noDeficit()
返回false,此时您停止。这是您的意图吗?如果没有更多的上下文,这很难理解。您迭代的集合是什么?它与
cN
a
cR
有什么关系?所有这些
实用工具
方法是用于什么的?您所说的“以循环方式”是什么意思?我不确定我是否完全理解这个问题,但如果存在noDeficit,我可以允许该过程完成,这样我就可以将其从列表中删除,并在将来停止对其进行迭代。如果find永远都不是真的,这是一种打破while循环的方法,因为可能根本没有安全序列。我将添加更多的注释伙计们!我是conc与此相关的事实是,自noDeficit()可能永远不会满意,循环将如何中断?这实际上似乎很有帮助,所以我将尝试一下。提前谢谢您。如果它有效,我将确保将其标记为答案。@RománMaksimov-因为我不确定您是如何输入此方法的,所以我将其作为一种通用方法。但是,是的,您可以使用您的find标志来控制循环ll.事实上,如果你只需要经历这一次,你就可以完全删除外部循环。只需迭代,然后在完成后,删除itemsToRemoveList中的任何元素并退出该方法。如果该列表中没有元素,则没有“找到”…祝你好运。
    //todo  create loop condition for stopping, eg originalList.size() > 0
    //eg
    List<Integer> itemsToRemoveList = new ArrayList<Integer>();
    while (originalList.size() > 0) { 
       Iterator it = originalList.iterator();      

       while (it.hasNext()) {
          Integer thisOne = it.next();
          found=false;
          // this process, can be removed from the list
          if(noDeficit(cN[thisOne], a[thisOne], cR)){

              // we take away its resources and give them to the bank
              Utility.add(cR, a[thisOne]);
              Utility.zeroOut(cN[thisOne]);
              Utility.zeroOut(a[thisOne]);

              // we remove it from the list of processes 
              itemsToRemoveList.add(thisOne);
           }                                   
        } //end loop

        for (Integer integerToRemove : itemsToRemoveList) {  
           originalList.remove(integerToRemove);
        }
        itemsToRemoveList.clear();

   }