Skip to content
This repository has been archived by the owner on Mar 30, 2018. It is now read-only.

Commit

Permalink
Performance improvements by switching from LinkedList to HashMap on
Browse files Browse the repository at this point in the history
Spleefer lists.
  • Loading branch information
mkalus committed May 1, 2012
1 parent 9aa0204 commit 9131c47
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 54 deletions.
19 changes: 7 additions & 12 deletions src/main/java/de/beimax/simplespleef/game/GameStandard.java
Expand Up @@ -1349,9 +1349,8 @@ public boolean endGame() {

// do we need to teleport players?
if (oldStatus == Game.STATUS_COUNTDOWN || oldStatus == Game.STATUS_INTERRUPTED) { // game ended during countdown - teleport players back to lounge
for (Spleefer spleefer : spleefers.get()) {
if (!spleefer.hasLost()) // will leave out players that left, died, lost, etc.
teleportPlayer(spleefer.getPlayer(), "lounge");
for (Spleefer spleefer : spleefers.getLost()) {
teleportPlayer(spleefer.getPlayer(), "lounge");
}
}

Expand Down Expand Up @@ -1488,10 +1487,7 @@ public String getListOfUnreadySpleefers() {
// no spleefers - return null
if (spleefers == null || spleefers.size() == 0) return null;
// get unready spleefers
LinkedList<Spleefer> list = new LinkedList<Spleefer>();
for (Spleefer spleefer : spleefers.get()) {
if (!spleefer.isReady()) list.add(spleefer);
}
List<Spleefer> list = spleefers.getUnready();
// is the list empty?
if (list.size() == 0) return null; // no unready spleefes
// compile list
Expand Down Expand Up @@ -1703,9 +1699,9 @@ protected boolean checkGameOver() {
* @param player
*/
protected void winByTouching(Player player) {
for (Spleefer spleefer : spleefers.get()) {
for (Spleefer spleefer : spleefers.getNotLost()) {
// if not the winning player and not already lost
if (spleefer.getPlayer() != player && !spleefer.hasLost())
if (spleefer.getPlayer() != player)
playerLoses(spleefer.getPlayer(), true);
}
// check game over manually, if there was no winner yet
Expand Down Expand Up @@ -1980,9 +1976,8 @@ protected boolean removeShovelItems() {
// check setting first
if (!configuration.getBoolean("playersLoseShovelAtGameEnd", true)) return false; // no shovels lost
// if yes, remove shovels from remaining players
for (Spleefer spleefer : spleefers.get()) {
if (!spleefer.hasLost())
removeShovelItem(spleefer.getPlayer(), false); // remove shovel without checking setting again
for (Spleefer spleefer : spleefers.getNotLost()) {
removeShovelItem(spleefer.getPlayer(), false); // remove shovel without checking setting again
}
return true;
}
Expand Down
18 changes: 7 additions & 11 deletions src/main/java/de/beimax/simplespleef/game/GameWithTeams.java
Expand Up @@ -200,12 +200,10 @@ protected boolean checkGameOver() {
// check if teams are still here
boolean[] stillHere = {false, false};
// check spleefer's status
for (Spleefer spleefer : spleefers.get()) {
if (!spleefer.hasLost()) { // not lost?
int team = spleefer.getTeam(); //out-of-bounds check
if (team == Spleefer.TEAM_BLUE || team == Spleefer.TEAM_RED)
stillHere[spleefer.getTeam() - 1] = true; // team is still here
}
for (Spleefer spleefer : spleefers.getNotLost()) {
int team = spleefer.getTeam(); //out-of-bounds check
if (team == Spleefer.TEAM_BLUE || team == Spleefer.TEAM_RED)
stillHere[spleefer.getTeam() - 1] = true; // team is still here
}
// do we have a team that isn't here?
for (int i = 0; i < stillHere.length; i++)
Expand All @@ -217,11 +215,9 @@ protected boolean checkGameOver() {
protected void winByTouching(Player player) {
// get team
int team = -99;
for (Spleefer spleefer : spleefers.get()) {
if (spleefer.getPlayer() == player) {
team = spleefer.getTeam();
break;
}
Spleefer s;
if ((s = spleefers.getSpleefer(player)) != null) {
team = s.getTeam();
}
if (team == -99) {
SimpleSpleef.log.warning("[SimpleSpleef] Could not determine winning team while touching a block.");
Expand Down
89 changes: 58 additions & 31 deletions src/main/java/de/beimax/simplespleef/game/SpleeferList.java
Expand Up @@ -18,6 +18,7 @@
**/
package de.beimax.simplespleef.game;

import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
Expand All @@ -36,7 +37,7 @@ public class SpleeferList {
* @param players
* @return
*/
public static String getPrintablePlayerList(LinkedList<Spleefer> players) {
public static String getPrintablePlayerList(List<Spleefer> players) {
// build list of winners
StringBuilder builder = new StringBuilder();
int i = 0;
Expand All @@ -54,13 +55,13 @@ public static String getPrintablePlayerList(LinkedList<Spleefer> players) {
* list of spleefers currently spleefing
* - Since we have to iterate the list most of the time anyway, we simply use a linked list
*/
private LinkedList<Spleefer> spleefers;
private HashMap<String, Spleefer> spleefers;

/**
* Constructor
*/
public SpleeferList() {
spleefers = new LinkedList<Spleefer>();
spleefers = new HashMap<String, Spleefer>();
}

/**
Expand All @@ -69,10 +70,7 @@ public SpleeferList() {
* @return spleefer or null
*/
public Spleefer getSpleefer(Player player) {
for (Spleefer spleefer : spleefers) {
if (spleefer.getPlayer() == player) return spleefer;
}
return null;
return spleefers.get(player.getName());
}

/**
Expand All @@ -82,7 +80,7 @@ public Spleefer getSpleefer(Player player) {
*/
public boolean addSpleefer(Player player) {
if (hasSpleefer(player)) return false;
spleefers.add(new Spleefer(player));
spleefers.put(player.getName(), new Spleefer(player));
return true;
}

Expand All @@ -92,12 +90,8 @@ public boolean addSpleefer(Player player) {
* @return boolean, true if successful
*/
public boolean removeSpleefer(Player player) {
for (Spleefer spleefer : spleefers) {
if (spleefer.getPlayer() == player) {
spleefers.remove(spleefer);
return true;
}
}
if (spleefers.remove(player.getName()) != null) return true;

return false;
}

Expand All @@ -107,10 +101,7 @@ public boolean removeSpleefer(Player player) {
* @return
*/
public boolean hasSpleefer(Player player) {
for (Spleefer spleefer : spleefers) {
if (spleefer.getPlayer() == player) return true;
}
return false;
return spleefers.containsValue(player.getName());
}

/**
Expand All @@ -119,9 +110,9 @@ public boolean hasSpleefer(Player player) {
* @return
*/
public boolean hasLost(Player player) {
for (Spleefer spleefer : spleefers) {
if (spleefer.getPlayer() == player) return spleefer.hasLost();
}
Spleefer spleefer = getSpleefer(player);
if (spleefer != null) return spleefer.hasLost();

return false;
}

Expand All @@ -130,9 +121,8 @@ public boolean hasLost(Player player) {
* @param player
*/
public void setLost(Player player) {
for (Spleefer spleefer : spleefers) {
if (spleefer.getPlayer() == player) spleefer.setLost(true);
}
Spleefer spleefer = getSpleefer(player);
if (spleefer != null) spleefer.setLost(true);
}

/**
Expand All @@ -141,7 +131,7 @@ public void setLost(Player player) {
*/
public int inGame() {
int inGame = 0;
for (Spleefer spleefer : spleefers) {
for (Spleefer spleefer : spleefers.values()) {
if (!spleefer.hasLost()) inGame++;
}
return inGame;
Expand All @@ -154,7 +144,7 @@ public int inGame() {
*/
public int inGame(int team) {
int inGame = 0;
for (Spleefer spleefer : spleefers) {
for (Spleefer spleefer : spleefers.values()) {
if (spleefer.getTeam() == team && !spleefer.hasLost()) inGame++;
}
return inGame;
Expand All @@ -173,15 +163,52 @@ public int size() {
* @return
*/
public List<Spleefer> get() {
return spleefers;
LinkedList<Spleefer> list = new LinkedList<Spleefer>();
for (Spleefer spleefer : spleefers.values()) {
list.add(spleefer);
}
return list;
}

/**
* get list of players that have lost
*/
public List<Spleefer> getLost() {
LinkedList<Spleefer> list = new LinkedList<Spleefer>();
for (Spleefer spleefer : spleefers.values()) {
if (spleefer.hasLost()) list.add(spleefer);
}
return list;
}

/**
* get list of players that have not lost yet
*/
public List<Spleefer> getNotLost() {
LinkedList<Spleefer> list = new LinkedList<Spleefer>();
for (Spleefer spleefer : spleefers.values()) {
if (!spleefer.hasLost()) list.add(spleefer);
}
return list;
}

/**
* get list of players that are not ready yet
*/
public List<Spleefer> getUnready() {
LinkedList<Spleefer> list = new LinkedList<Spleefer>();
for (Spleefer spleefer : spleefers.values()) {
if (!spleefer.isReady()) list.add(spleefer);
}
return list;
}

/**
* return iterator of spleefers list
* @return
*/
public Iterator<Spleefer> iterator() {
return spleefers.iterator();
return spleefers.values().iterator();
}

/**
Expand All @@ -191,7 +218,7 @@ public Iterator<Spleefer> iterator() {
*/
public List<Spleefer> getTeam(int team) {
LinkedList<Spleefer> compiledTeam = new LinkedList<Spleefer>();
for (Spleefer spleefer : spleefers) {
for (Spleefer spleefer : spleefers.values()) {
if (spleefer.getTeam() == team) compiledTeam.add(spleefer);
}

Expand All @@ -205,7 +232,7 @@ public List<Spleefer> getTeam(int team) {
*/
public int countUnreadyPlayers() {
int unready = 0;
for (Spleefer spleefer : spleefers) {
for (Spleefer spleefer : spleefers.values()) {
if (!spleefer.isReady()) unready++;
}
return unready;
Expand All @@ -217,7 +244,7 @@ public int countUnreadyPlayers() {
*/
public int countLostPlayers() {
int lost = 0;
for (Spleefer spleefer : spleefers) {
for (Spleefer spleefer : spleefers.values()) {
if (!spleefer.hasLost()) lost++;
}
return lost;
Expand Down

0 comments on commit 9131c47

Please sign in to comment.