【问题标题】:Reassign `this` in Java class在 Java 类中重新分配“this”
【发布时间】:2014-05-26 03:03:51
【问题描述】:

我现在只是在 Java 中闲逛,尝试使用链表实现类似于堆栈的东西。

class ListStack {

    int value;
    int size;
    ListStack next;

    public ListStack (int add) {
        this.size = 1;
        this.value = add;
        this.next = null;
    }

    public void push (int add) {
        this.next = this;
        this.value = add;
        this.size++;
    }

    public int pop() {
        if (this.size == 0) { throw new EmptyListStackException(); }
        int i = this.value;
        this = this.next;
        this.size--;
        return i;
    }

    public int size() {
        return this.size;
    }

    public int peek() {
        return this.value;
    }
}

基本上它是一个在前面插入的链表,它也从前面删除。当我尝试执行 this = this.next 时,NetBeans 弹出错误;它说我无法重新分配最终值this

我希望我的最终实现执行如下操作:

ListStack var = new ListStack(5); //var is now 5 -> null
var.push(3); //var is now 3 -> 5 -> null
int val = varr.pop(); //var is now 5 -> null, val == 3

评论把this = this.next 代码,其余的似乎工作。

ListStack a = new ListStack(5);
System.out.println(a.size()); //prints 1
System.out.println(a.peek()); //prints 5
a.push(4);
System.out.println(a.size()); //prints 2
System.out.println(a.peek()); //prints 4
a.push(6);
System.out.println(a.size()); //prints 3
System.out.println(a.peek()); //prints 6
a.push(1);
System.out.println(a.size()); //prints 4
System.out.println(a.peek()); //prints 1
//a is 1 -> 6 -> 4 -> 5 -> null

【问题讨论】:

  • this 指的是当前对象。这就像说:“我是”或“我的名字是”。你无法改变自己。
  • @SotiriosDelimanolis 生活课程和 Java 课程
  • 那是因为你不能重新分配this。您需要做的是为您的列表设置一个锚点对象。否则,您无法从列表的头部添加/删除。
  • 基本上,您编写了一个类,说它应该是一个“堆栈”,它是元素的集合,但您的实现看起来像 一个元素的实现> 一堆。 (单个元素会有next,但整个堆栈不会。)考虑将其分为两个类。
  • 如果所有push 都应该存储一个数字并增加另一个数字,是的,它“按预期”工作。通过这种措施,pop 甚至无法编译时“按预期”工作。

标签: java reference this abstract-data-type


【解决方案1】:

您的代码中有一个概念性错误:基本上您没有使用 push 方法创建任何新的堆栈元素。

但问题是调用类 listStack 会产生误导,因为实际上您要创建的是堆栈的新元素,因此您可能应该创建一个类节点。 此外,您不能覆盖“this”,因为它是一个 java 关键字,它总是引用当前对象。

为了提示您如何将堆栈实现为链表,您应该创建 class Node 并使用值字段 value 和对先前 Node 的引用(第一个节点将只有一个空指针)。

ListStack类中,你应该有一个对最后一个节点的引用,它的push()方法应该创建一个新节点并将这个节点设置为新的最后一个节点。

【讨论】:

  • 干杯,虽然我能够在没有单独的节点类的情况下实现它。 pastebin.com/ySRp0nZA
  • @riista - 我已经看到堆栈方案使用“条目”作为“头”,而不是为“头”设置单独的类,但这需要特殊的“条目”不用于包含堆栈数据。
【解决方案2】:

让我指出正确的方向。正如其他人评论的那样,这个堆栈不能正常工作考虑做这样的事情:

public class ListStack {

private class Node {
    private int value;
    private Node next;

            //inner class which holds your each element and reference to next
            //fill all details required     
}

private Node head;
private int size;

public ListStack() {
    head = null;
    size = 0;
}

public void push(int value) {
    Node temp = new Node(value);
    if(head == null)
        head = temp;
    else {
        temp.setNext(head); // provide link to already existing stack
        head = temp;       // bring new element on top
    }
}

public int pop() {
    if(head==null);
        //throw exception
    int temp = head.getValue();
    head = head.getNext(); //remove element and bring down the stack
    return temp;
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 2011-12-20
    • 2014-01-20
    • 2016-06-07
    • 2011-07-28
    • 1970-01-01
    相关资源
    最近更新 更多