gpt4 book ai didi

java - 将一个特定条目从一个 LinkedHashMap 添加到另一个 LinkedHashMap

转载 作者:行者123 更新时间:2023-11-30 06:15:52 25 4
gpt4 key购买 nike

我有 2 个 LinkedHashMap,

LinkedHashMap<ArrayList<Point>, Color> map;
LinkedHashMap<ArrayList<Point>, Color> totalMap;

两者是相同的,但 map 已通过使用撤消按钮删除了其中的条目。为了重做之前撤消的ArrayList,我一直在尝试迭代totalMap,并将每个条目添加到map.size,因为这将用重复项替换 map 中的点,并且还添加一个,我将如何进行做这个?

编辑:我已经重写了好几次了,但这是我发布的最新版本

public LinkedHashMap<ArrayList<Point>, Color> putNext(LinkedHashMap<ArrayList<Point>, Color> map1,
LinkedHashMap<ArrayList<Point>, Color> map2) {
for (Map.Entry<ArrayList<Point>, Color> entry : map2.entrySet()) {
if (map1.size() < map2.size()) {
map1.put(entry.getKey(), entry.getValue());
}
}
return map1;
}

编辑2:

我正在编写一个绘画程序,它旋转/反射所有点以生成图案,Seen here

为了绘制点,我创建了一个 ArrayList,然后它将在 PaintComponent() 方法中绘制到屏幕上。为了处理小的变化,例如扇区数量和撤消/重做,我一直将 ArrayList 添加到 LinkedHashMap,然后再将其无效。在处理Undo时,我制作了两个相同的Map,map和totalMap,但是当调用undo()时,它会从map中删除最新的条目,而totalMap保持不变。

我一直在尝试做的是,当按下重做时,它将从totalMap的索引map.size处获取条目,并将其放入map中。

谢谢

最佳答案

要实现撤消/重做逻辑,您需要两个堆栈和一个表示要撤消/重做的操作的类。

在你的例子中,一个 Action 似乎由 ArrayList<Point> 组成。和一个 Color ,因此创建一个类并将它们作为字段。

在更高级的系统中,可以有不同类型的操作,Action更有可能是 interface ,不是class .

然后您将拥有两堆 Action 对象。在 Java 中,使用 Deque 当您需要堆栈功能时。

然后你就会有这样的逻辑:

Deque<Action> undoStack = new ArrayDeque<>();
Deque<Action> redoStack = new ArrayDeque<>();

public void doAction(Action action) {
redoStack.clear(); // new action prevents redo of previous undo
undoStack.push(action);
}

public Action undoAction() {
Action action = undoStack.pop(); // Throws exception if stack is empty
redoStack.push(action);
return action;
}

public Action redoAction() {
Action action = redoStack.pop(); // Throws exception if stack is empty
undoStack.push(action);
return action;
}

关于java - 将一个特定条目从一个 LinkedHashMap 添加到另一个 LinkedHashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49212683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com