我写了一个简单易用的代码来交换列表中的两个元素,如下所示:
public void swap(Item a, Item aprev, Item b, Item bprev){
aprev.next = b;
bprev.next = a;
}
现在。如果我想实际交换两个元素,没有什么真正改变。所以,如果我这样做:
SelectionSortableList list = new SelectionSortableList();
Item item = list.new Item("4");
Item item1 = list.new Item("5");
Item item2 = list.new Item("6");
Item item3 = list.new Item("7");
list.addFront(item.value);
list.addFront(item1.value);
list.addFront(item2.value);
list.addFront(item3.value);
System.out.println(list.toString());
list.swap(item1, item, item3, item2);
System.out.println(list.toString());
/* */ public abstract class SinglyLinkedList
/* */ {
/* */ protected SinglyLinkedList.Item head;
/* */
/* */ public void addFront(String s) {
/* 6 */ if (head == null) {
/* 7 */ head = new SinglyLinkedList.Item(s);
/* */ }
/* */ else {
/* 10 */ SinglyLinkedList.Item insert = new SinglyLinkedList.Item(s);
/* 11 */ next = head;
/* 12 */ head = insert;
/* */ }
/* */ }
/* */
/* */ public void add(String[] array) { String[] arrayOfString;
/* 17 */ int j = (arrayOfString = array).length;
for (int i = 0; i < j; i++) { String s = arrayOfString[i];
/* 18 */ addFront(s);
/* */ }
/* */ }
/* */
/* */ public String toString()
/* */ {
/* 24 */ if (head == null) {
/* 25 */ return "empty list";
/* */ }
/* 27 */ String s = "";
/* */
/* 29 */ for (SinglyLinkedList.Item helper = head; next != null;
helper = next) {
/* 30 */ s = String.valueOf(s) + value + ", ";
/* */ }
/* 32 */ s = String.valueOf(s) + value;
/* 33 */ return s;
/* */ }
/* */
/* */ public abstract void sort();
/* */
/* */ protected class Item
/* */ {
/* */ public Item next;
/* */ public String value;
/* */
/* */ public Item(String value) {
/* 44 */ this.value = value;
/* */ }
/* */ }
/* */ }
很抱歉这个烂摊子,但它是一个反编译的jar。这是我尚未完成的课程:
public class SelectionSortableList extends SinglyLinkedList{
public Item head;
public SelectionSortableList(){
this.head = new Item(null);
}
public void swap(Item a, Item aprev, Item b, Item bprev){
aprev.next = b;
bprev.next = a;
}
没有任何改变,他像以前一样打印我完全相同的列表。我真的不知道为什么这不起作用。如果有人可以给我一个提示,或者如果我应该多写一点,那就太棒了。先谢谢你:))
答案 0 :(得分:0)
首先,值得一提的是,为什么你必须选择这样做,而不是使用Java Collections Framework中的类。
但即使你出于教育目的这样做,例如了解列表中运行的列表数据结构和算法,我建议首先使用标准Java API对其进行编程,例如在this example中。
然后,要了解内部发生了什么,请按照使用过的类的来源进行操作。您可以在OpenJDK project或nicely browsable here找到它。
了解了这一点后,您可以返回并实现自己的版本,并且(例如,如果您必须)使用给定的数据结构。
关于你的具体问题 - 我还没有尝试过(你应该按照之前的建议调试),但我假设在扩展类并使用相同的成员变量名时,你会影响基类一个,因此不要对它进行操作。所以你应该扩展功能,但要处理相同的数据结构。