Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 历史课中重做的误用_Java - Fatal编程技术网

Java 历史课中重做的误用

Java 历史课中重做的误用,java,Java,我是计算机科学专业的学生。这学期,我要做一个项目(数独)。该项目的一个特点是建立历史记录。所以我开始实现这个特性。 “撤销”似乎有效,但我对重做有点问题。我想我知道这个bug是从哪里来的,但我不知道如何修复它 当我更改“案例”的值时,我会将旧的“案例”添加到我的历史记录中。这使我可以用undo恢复它们。然而,当我“重做”时,第一个动作什么也不做,如果我做了所有可能的“重做”,它就会丢失一个动作。我想这是因为我只有旧的价值观​​而不是新闻。但是如果我加上新闻,问题就会迎刃而解(撤销bug,重做有用

我是计算机科学专业的学生。这学期,我要做一个项目(数独)。该项目的一个特点是建立历史记录。所以我开始实现这个特性。 “撤销”似乎有效,但我对重做有点问题。我想我知道这个bug是从哪里来的,但我不知道如何修复它

当我更改“案例”的值时,我会将旧的“案例”添加到我的历史记录中。这使我可以用undo恢复它们。然而,当我“重做”时,第一个动作什么也不做,如果我做了所有可能的“重做”,它就会丢失一个动作。我想这是因为我只有旧的价值观​​而不是新闻。但是如果我加上新闻,问题就会迎刃而解(撤销bug,重做有用吗?)

如果你有一个想法或轨道,我很感兴趣!提前谢谢你

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

// 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();
“撤消”(工作)时的代码:

当我“重做”(不工作)时编码:

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

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”。我认为这是因为我总是添加旧值,因此我的历史记录不包含第一次撤消之前对象的状态。。。但我不知道我能做什么

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

我否决了这个问题,因为这里的代码太多了。为了明确你的问题所在,请删除任何不直接导致你的问题的代码,如果你能把它减少到十行或更少,我会考虑撤回投票。请看:另外,我要警告你,如果你的导师发现了这一点,你可能会面临剽窃和/或允许剽窃的指控。相反,您应该创建一个演示您的问题的应用程序,而不会泄露太多的作业解决方案。这里的所有代码都是这个应用程序所必需的,因此您可以理解我的方法。Case和History是我的项目中使用的类,每个方法都被使用。所以我不知道如何制作一个简短的示例……您肯定不是建议您需要所有283行代码来重做吗?我编辑过。我尽可能多地总结。
LEFT : []
 RIGHT : [Case : Candidates :[]
, Case : Candidates :[1]
]
LEFT : [Case : Candidates :[]
]
 RIGHT : [Case : Candidates :[1]
]

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