繁体   English   中英

使用增强的for循环时更改arraylist的大小

[英]Changing an arraylist size while using an enhanced for loop

我正在尝试打仗,每当您比较两张纸牌时if(c.getValue() > Player2.get(x).getValue()){...我正在寻找赢家并重新分配玩家的纸牌和玩家将两张卡片放到保持堆中, ArrayList<Card> Pile = new ArrayList<Card>(); ,然后根据布尔值将该堆分配给获胜者,但是控制台抛出“ concurrentModificationException”,我不知道有其他方法可以解决此问题。 比较两个对象数组列表后,如何添加大小不断变化的数组列表?

import java.util.ArrayList;

public class Deck {
    ArrayList<Card> deck = new ArrayList<Card>();
    ArrayList<Card> player1 = new ArrayList<Card>();
    ArrayList<Card> player2 = new ArrayList<Card>();
    ArrayList<Card> pile = new ArrayList<Card>();
    boolean winner;

    public Deck(){

    }
    public void createDeck(){
        for(int i =0; i<4; i++){        
            for(int j =1; j<15;j++){            
                if(i==0) deck.add(new Card("Spades", j));                   
                if(i==1) deck.add(new Card("Hearts", j));
                if(i==2) deck.add(new Card("Clubs", j));
                if(i==3) deck.add(new Card("Diamonds",j));

            }
        }
    }
    public void splitDeck(){
        for(int i = 0; i< 52;i++){
            int r = (int) (Math.random()*(51-i));
            if(i%2==0){
                player1.add(deck.get(r));
            }
            else{
                player2.add(deck.get(r));
            }
            deck.remove(r);
        }

    }
    public int [] war(){

        int[]score = {0,0};

        for(Card c : player1){
            int x = player1.indexOf(c);
            if(c.getValue() > player2.get(x).getValue()){
                winner = true;
                score[0]++;
                pile.add(player1.get(x));
                pile.add(player2.get(x));
                distributeCards();
            }
            else if(c.getValue() <player2.get(x).getValue()) score[1]++;
            distributeCards();
        }

        return score;
    }   

    public void distributeCards(){

            if(winner==true){
                for(int i = 0; i<pile.size(); i++){
                    player1.add(pile.get(i));
                }
            }
            else{
                for(int i = 0; i<pile.size(); i++){
                    player2.add(pile.get(i));
                }
            }
        }


    public String warGame(){
        String print= "";
        for(Card c : player1){
            int x = player1.indexOf(c);
            if(c.getValue() > player2.get(x).getValue()){

                print+= "\n"+"Player1 won";
            }
            else if(c.getValue() <player2.get(x).getValue())
                print+="\n"+"Player2 won";

            else if(c.getValue() ==player2.get(x).getValue())
                print+= "\n"+"Its a tie";
        }

        return print;

    }

}

控制台错误

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
    at java.util.ArrayList$Itr.next(Unknown Source)
    at Deck.war(Deck.java:69)
    at War.main(War.java:6)

您需要一个CopyOnWriteArrayList,请参阅http://docs.oracle.com/javase/tutorial/collections/implementations/list.html 它的本质是CopyOnWriteArrayList不会引发并发修改异常(因此您可以在对它们进行迭代的同时将其添加),但这是以每次写入时复制基础数据为代价的。 由于您的用例是战争游戏,因此这种性能但可能不会那么明显。

您也可以尝试ListIterator ,它在迭代过程中支持remove / add方法。

当您要修改要迭代的ArrayList时,解决方案非常简单:

private List<YourObject> list = new ArrayList<>();
public void removeFromList(){
     List<YourObject> tempList = new ArrayList<>();
     for (Object o: list) {
         o.doSomething();
         if (yourCondition){
             tempList.add(o);
         }
     }
     list = tempList;
}

这是为了删除对象,但是添加对象的实现也非常简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM