我正在制作一个 Spring 应用程序,该应用程序将使用户能够在游戏等待大厅中等待。 (像队列一样)
所以我会有4个地区,美洲,非洲,欧盟和中东。
我正在考虑创建一个类似的地图,
UserId1 - Region1
UserId2 - Region2
UserId3 - Region2
UserId4 - Region4
UserId5 - Region3
您可能不需要回电。只需定义一个方法来检查 userId 是否已在地图中:
boolean addUser(String userId, Integer regionId) {
if (hm.containsKey(userId)) return false; // Or throw an exception if you prefer
hm.put(userId, regionId);
return true;
}
对于后一部分,我不太明白你到底想检查什么。您想要检查是否有来自特定区域的用户,或者统计来自特定区域的所有用户,或者两者兼而有之?您可能需要一个单独的方法
您可以为 put 方法编写自己的回调。 尽管它不是性能最好的解决方案,但这里是一个示例实现,当然您可以通过您希望可用的接口传递任何参数,例如键和值等。
public class Main {
private interface ICallbackSomething<V> {
void hahIWasOverwritingThisOriginalValue(V originalValueForSameId);
void howOftenIsTheCountryContained(long amount);
}
//put this in an own file
private class CallMeBackMap<K,V> extends HashMap<K,V> {
public V customPut(K key, V value, ICallbackSomething<V> myCallback) {
if (keySet().contains(key))
myCallback.hahIWasOverwritingThisOriginalValue(get(key));
if (values().contains(value))
myCallback.howOftenIsTheCountryContained(values().stream().filter(val -> val.equals(value)).count());
return super.put(key, value);
}
}
public static void main(String[] args) {
CallMeBackMap map = new CallMeBackMap<String, String>();
ICallbackSomething iCallbackSomething = new ICallbackSomething() {
@Override
public void hahIWasOverwritingThisOriginalValue(Object originalValueForSameId) {
System.out.println("Lol, i just was overwriting region " + originalValueForSameId);
// your code goes here
}
@Override
public void howOftenIsTheCountryContained(long amount) {
System.out.println("Hah, ther is " + amount + " living here.");
// your other code goes here
}
};
map.customPut("userId1", "Region1", iCallbackSomething);
map.customPut("userId2", "Region2", iCallbackSomething);
map.customPut("userId3", "Region2", iCallbackSomething);
}
}