【问题标题】:How do I implement abstraction and generics in java?如何在 java 中实现抽象和泛型?
【发布时间】:2017-07-22 23:36:04
【问题描述】:

我目前有一个需要使用抽象和泛型的项目,但我什至不知道我应该从哪里开始。抽象类如下。

public abstract class Links<AType> {
    abstract AType getElem(); //returns the head of the list
    abstract Links<AType> getNext(); //return the next link
}

这是扩展抽象类的类

public class Cons<AType> extends Links<AType> {
    AType elem;
    Links<AType> next;

    Cons(AType elem, Links<AType> next) {
        this.elem = elem;
        this.next = next;
    }

    @Override
    AType getElem() {
        return elem;
    }

    @Override
    Links<AType> getNext() {
        return next;
    }
}

这是另一个扩展抽象类的类

public class Nil<AType> extends Links<AType> {
    Nil(){}

    @Override
    AType getElem() {
        return null;
    }

    @Override
    Links<AType> getNext() {
        return null;
    }
}

这是应该实现所有内容的类

public class LList<AType> {
    Links<AType> list;
    LList() {
        list = new Cons<>();
    }

    Links<AType> getList() {
        return list;
    }

    AType get(int n, AType a) {
        Cons<AType> aTypeCons = new Cons<>(a, list);
        return null;
    }

    void add(AType elem) {
        //add to head of list
    }

    void remove(int i) {
        //remove ith element
        //do nothing if i is invalid
    }

    void print() {
        //prints the list
    }


}

我只需要一些帮助来确定实际从哪里开始制作 LList 类。我无法弄清楚构造函数,因为 Links 是抽象的,所以我无法将其设为对象,也无法创建新的 Cons 因为没有元素传递给构造函数。但是,构造函数应该实例化一个新列表。我也无法弄清楚我应该如何访问该列表的单个元素。如果我对构造函数中需要发生的事情有一点了解,我应该能够弄清楚如何实现其余的方法。

【问题讨论】:

  • 当您将 Cons 的实例放入 Links 类时,您将只能使用在 Links 类中声明的方法。在 LList 类中将列表类型更改为 Cons 或合并 Cons 和 Links 类,因为我认为没有抽象点。
  • get的第二个参数是什么?

标签: java list generics linked-list


【解决方案1】:

您的LList 是一个单链表,其中每个元素都有一个值和一个指向后面列表的链接。列表的最后一个元素将始终是一个Nil 对象,它表示一个空列表。当你第一次初始化一个空列表时,你可以分配list = new Nil&lt;&gt;();。将元素添加到列表时,可以将其重新分配为 list = new Cons&lt;&gt;(elem, list);

要按索引访问列表中的元素,只需使用调用getNext()while 循环,直到它到达所需的索引或找到列表的末尾。

AType get(int n) {
    Links<AType> current = list;
    while (n > 0 && current instanceof Cons) {
        current = current.getNext();
        n--;
    }
    return current.getElem();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2012-12-10
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    相关资源
    最近更新 更多