【问题标题】:Adding a specific entry from one LinkedHashMap to another将特定条目从一个 LinkedHashMap 添加到另一个
【发布时间】:2018-03-10 18:39:05
【问题描述】:

我有 2 个 LinkedHashMap,

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

两者是相同的,但地图已通过使用撤消按钮从其中删除了条目。为了重做先前撤消的ArrayList,我一直在尝试遍历totalMap,并将每个条目添加到map.size,因为这将用重复的点替换地图中的点,并且还要添加一个,我该怎么做这样做?

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

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;
}

EDIT2:

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

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

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

谢谢

【问题讨论】:

  • 我一直在尝试:那么,您尝试的代码在哪里?为什么不直接使用 putAll()? docs.oracle.com/javase/8/docs/api/java/util/…?
  • 我认为需要更多解释。你不应该使用 ArrayLists 作为映射键。
  • 当我第一次想到如何做到这一点时,我认为这样做是不切实际的,但我想不出另一个
  • @JBNizet 对于每次按下重做它应该只添加来自totalMap的下一个条目,而不是全部
  • 您是否误用 LinkedHashMap 作为配对值的List?一个动作将ArrayList&lt;Point&gt;, Color 对附加到末尾,撤消删除最后一个条目,并重做从另一个映射重新添加它?如果是这样,为这对值创建一个类,并将 Map 替换为该类的 List

标签: java hashmap


【解决方案1】:

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

在你的情况下,一个动作似乎由一个ArrayList&lt;Point&gt; 和一个Color 组成,所以创建一个将它们作为字段的类。

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

然后您将拥有两个动作对象堆栈。在 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多