Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting an error with a sublist

Tags:

java

I'm making a 4-player team game and was asked to use a sublist. Here are the lists:

/**
 * The list of players in this team.
 */
private final static List<Player> players = new LinkedList<Player>();

/**
 * A list of players in the waiting room.
 */
private final static List<Player> waitingPlayers = new LinkedList<Player>();

I'm getting this error:

java.util.ConcurrentModificationException
[11/25/11 3:36 PM]:     at java.util.SubList.checkForComodification(Unknown Sour
ce)
[11/25/11 3:36 PM]:     at java.util.SubList.listIterator(Unknown Source)
[11/25/11 3:36 PM]:     at java.util.AbstractList.listIterator(Unknown Source)
[11/25/11 3:36 PM]:     at java.util.SubList.iterator(Unknown Source)
[11/25/11 3:36 PM]:     at java.util.AbstractCollection.contains(Unknown Source)

[11/25/11 3:36 PM]:     at java.util.AbstractCollection.removeAll(Unknown Source)

code listed here.

public static void enterGame(final Client c) {      
    if(waitingPlayers.size() < 4) {
        c.sendMessage("Waiting for 4 players");
        return; // not enough players
    }
    // Picks 4 ppl from the list
    System.out.println("Starting new game");
    Collections.shuffle(waitingPlayers);
    System.out.println("Picking random players");
    final List<Player> picked = waitingPlayers.subList(0, 4); 
    players.addAll(picked);
    waitingPlayers.removeAll(picked);
    if(players.contains(c)) {
        c.sendMessage("Your on a team!");
    }
}
like image 344
user1064922 Avatar asked Dec 16 '22 07:12

user1064922


1 Answers

The subList becomes invalid when the underlying original list changes. Make a copy of it, for example using

List<Player> picked = new ArrayList<Player>(waitingPlayers.subList(0,4));
waitingPlayers.removeAll(picked);
like image 92
Has QUIT--Anony-Mousse Avatar answered Dec 18 '22 21:12

Has QUIT--Anony-Mousse