Optimize common MemoryBoard operations

This reduces the complexity of:

1. retrieving the total chunks owned by a faction, and
2. removing a faction from the board.
This commit is contained in:
Harry5573 2015-08-25 23:19:09 +01:00 committed by eueln
parent 05cbf4cf5d
commit 0ede00f7df

View File

@ -1,5 +1,7 @@
package com.massivecraft.factions.zcore.persist; package com.massivecraft.factions.zcore.persist;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import com.massivecraft.factions.*; import com.massivecraft.factions.*;
import com.massivecraft.factions.struct.Relation; import com.massivecraft.factions.struct.Relation;
import com.massivecraft.factions.util.AsciiCompass; import com.massivecraft.factions.util.AsciiCompass;
@ -11,8 +13,49 @@ import java.util.Map.Entry;
public abstract class MemoryBoard extends Board { public abstract class MemoryBoard extends Board {
public HashMap<FLocation, String> flocationIds = new HashMap<FLocation, String>();
public class MemoryBoardMap extends HashMap<FLocation, String> {
Multimap<String, FLocation> factionToLandMap = HashMultimap.create();
@Override
public String put(FLocation floc, String factionId) {
String previousValue = super.put(floc, factionId);
if (previousValue != null) {
factionToLandMap.remove(previousValue, floc);
}
factionToLandMap.put(factionId, floc);
return previousValue;
}
@Override
public String remove(Object key) {
String result = super.remove(key);
if (result != null) {
FLocation floc = (FLocation) key;
factionToLandMap.remove(result, floc);
}
return result;
}
@Override
public void clear() {
super.clear();
factionToLandMap.clear();
}
public int getOwnedLandCount(String factionId) {
return factionToLandMap.get(factionId).size();
}
public Collection<FLocation> getOwnedLand(String factionId) {
return factionToLandMap.get(factionId);
}
}
public MemoryBoardMap flocationIds = new MemoryBoardMap();
//----------------------------------------------// //----------------------------------------------//
// Get and Set // Get and Set
//----------------------------------------------// //----------------------------------------------//
@ -88,12 +131,9 @@ public abstract class MemoryBoard extends Board {
} }
public void clean(String factionId) { public void clean(String factionId) {
Iterator<Entry<FLocation, String>> iter = flocationIds.entrySet().iterator(); Collection<FLocation> keys = flocationIds.getOwnedLand(factionId);
while (iter.hasNext()) { for (FLocation key : keys) {
Entry<FLocation, String> entry = iter.next(); flocationIds.remove(key);
if (entry.getValue().equals(factionId)) {
iter.remove();
}
} }
} }
@ -166,13 +206,7 @@ public abstract class MemoryBoard extends Board {
//----------------------------------------------// //----------------------------------------------//
public int getFactionCoordCount(String factionId) { public int getFactionCoordCount(String factionId) {
int ret = 0; return flocationIds.getOwnedLandCount(factionId);
for (String thatFactionId : flocationIds.values()) {
if (thatFactionId.equals(factionId)) {
ret += 1;
}
}
return ret;
} }
public int getFactionCoordCount(Faction faction) { public int getFactionCoordCount(Faction faction) {