在历史课上滥用重做

时间:2018-03-08 21:23:59

标签: java

我是计算机科学专业的学生。这个学期,我必须做一个项目(一个数独)。该项目的一个特点是建立历史。所以我开始实现这个功能。 “撤消”似乎有效,但我对重做有点问题。我想我明白了bug的来源,但我不知道如何修复它。

当我更改“案例”的值时,我将旧的“案例”添加到我的历史记录中。这允许我通过撤消来恢复它们。但是,当我“重做”时,第一个动作什么都不做,如果我可以做所有“重做”,那就错过了一个动作。我认为这是因为我只有旧的价值而不是新闻。但是,如果我添加新闻,问题就会逆转(撤消bug,redo有效吗?)。

如果您有想法或曲目,我很感兴趣!提前谢谢你!

以下是我在历史记录中添加项目时的代码:

// IN MY HISTORY CLASS    
public E getCurrentElement() {
        return leftQ.getLast();
}

public void add(E e) {
    leftQ.addLast(e);
    rightQ.clear();
    currentPosition = currentPosition + 1;
    endPosition = currentPosition;
}

// IN MY add actionPerformed
history.add(Case.duplicate(c)); // Add oldCase
c.addPossibleValue(++addedValues); // change old case
refresh();
当我“撤消”(工作)时

代码:

// IN MY HISTORY CLASS
public void goBackward() {
        currentPosition = currentPosition - 1;
        rightQ.add(leftQ.removeLast());
    }

// In my undo actionPerformed
c = history.getCurrentElement();
history.goBackward();
refresh();

代码,当我“重做”(不工作):

// IN MY HISTORY CLASS
public void goForward() {
        currentPosition = currentPosition + 1;
        leftQ.addLast(rightQ.poll());
    }

// In my redo actionPerformed

history.goForward();
c = history.getCurrentElement();
refresh();

这是我调试时的执行跟踪: 首先,我在我的历史中添加2个元素。所以我的标签上有“1 2”。 在第一次撤消结束时:

LEFT : [Case : Candidates :[] 
] --> FIRST Element on history, empty
 RIGHT : [Case : Candidates :[1] // Second one, contains "1"
]

第二次撤消:

LEFT : []
 RIGHT : [Case : Candidates :[]
, Case : Candidates :[1]
]

然后2重做:

LEFT : [Case : Candidates :[]
]
 RIGHT : [Case : Candidates :[1]
]

LEFT : [Case : Candidates :[]
, Case : Candidates :[1]
]
 RIGHT : []

我的标签只包含“1”。我认为它来自于我总是添加旧值的事实,因此我的历史记录在第一次撤消之前不包含对象的状态......但我不知道我该怎么办。

1 个答案:

答案 0 :(得分:0)

使用链接列表可能是缩短撤消/重做实现的好方法。将您的转弯存储为列表中的节点,这样无论何时转弯,您都会在列表末尾生成一个新节点。在每个节点内部,保存电路板布局的int [3] [3]。调用undo时,通过在前一个列表节点上加载板来退回板。当调用redo时,该节点仍在那里,你可以向前迈进一步。通过执行此操作,您可以一直撤消到1,然后一直重做以转向x。由于这只是数独,使用链表不需要太多内存。对于更复杂的要求,此解决方案不是最佳选择。