(我不确定如何在标题中总结这个问题)
我有一个随机数量的A类对象,它们有几个属性,包括颜色。然后我收到一个随机数的B类对象,它们都具有color属性。我需要更新我的A类对象范围,以匹配B类对象的颜色属性和B类对象的数量。可以删除,创建或修改A类对象。值得注意的是,可能永远不会存在两个具有相同颜色的A类对象。
最简单的方法是删除所有A类对象,然后创建新对象(相同数量的B类对象)并设置每个新创建的类A对象的color属性以匹配相应的B类对象的color属性。但是 - 在性能方面,修改类A对象的颜色属性以匹配B类对象的颜色属性是一个巨大的胜利,而不是删除A类对象并创建新对象。
A类对象最初包含在地图中。 B类对象到达矢量。
我想知道是否有人认识到这个问题,并且知道某种优雅的设计模式?
答案 0 :(得分:2)
未经测试的代码但应该有效。 Ir肯定会演示算法(不是模式)。
public void test() {
// Start data.
Map<String, A> asInAMap = new HashMap<>();
// The B's arrive.
List<B> arrivingBs = new ArrayList<>();
// Grab the A's and key them on colour.
Map<Colour, A> asInColour = new HashMap<>();
// Keep track of all As.
Set<A> availableAs = new HashSet<>(asInAMap.values());
// Roll them into the Map.
for (A a : availableAs) {
// Key all A's by colour.
asInColour.put(a.colour, a);
}
// Walk the Bs, matching up the A's
Set<A> matchedAs = new HashSet<>();
Set<B> unMatchedBs = new HashSet<>();
for (B b : arrivingBs) {
// Is there a matching A with the right colour?
A aMatched = asInColour.get(b.colour);
if (aMatched != null) {
// Keep track of the ones that matched.
matchedAs.add(aMatched);
} else {
// Keep track of all not-matched Bs.
unMatchedBs.add(b);
}
}
// Don't touch any of the matched ones.
availableAs.removeAll(matchedAs);
// Change colours of any A.s left.
Iterator<B> bsWithNewColours = unMatchedBs.iterator();
for (A changeAColour : availableAs) {
if (bsWithNewColours.hasNext()) {
B newB = bsWithNewColours.next();
// Change a spare A's colour.
changeAColour.colour = newB.colour;
// Finished with that one.
bsWithNewColours.remove();
}
}
// All that are left in notMatched must generate new A's.
for (B newColour : unMatchedBs) {
// Make a new A with a non-matched colour.
asInAMap.put(String.valueOf(newColour.colour), new A(newColour.colour));
}
}
本质: