【问题标题】:Create my own limited linkedlist based on java.util.linkedlist基于 java.util.linkedlist 创建我自己的有限链表
【发布时间】:2013-02-03 02:43:00
【问题描述】:

我想做一些简单的事情,即创建我自己的基于 java.util.linkedlist 的列表类,但我想限制可以做的事情。让我们说现在,我想要的唯一方法是 addFirst 方法。我正在创建一个单链表。我遇到的问题是 addFirst 似乎没有被识别,我不确定我是否在我自己的构造函数中正确创建了列表。这是我到目前为止的代码。

import java.util.LinkedList;


public class singleList {

singleList() {
     new LinkedList();
 }

//  void add(name addName) {
//      addFirst(addName);
//  }


public static void main(String[] args) {

singleList nameList = new singleList();

 name name1 = new name("John", "Smith");
 nameList.add(name1);


System.out.println("LinkedList contains : " + nameList);

 }
}

所以你可以看到我想要做的是创建一个名为 nameList 的列表,此时,它唯一能做的就是使用 add 方法,它应该调用 LinkedList 的 addFirst 方法,将元素添加到第一个在列表中的位置。这有意义吗?

我得到的第一个错误是它无法从我的 add 方法中找到符号“addFirst”,我也不确定我的 singleList 构造函数是否正确。

如果有人想知道,这是为了学校作业。

这是修改后的代码,我从这里的第一个答案中得到了一些建议,看起来与另一个相似。

public class SingleList {

private LinkedList internalList;

SingleList() {
     internalList = new LinkedList();
 }

void add(name addName) {
    internalList.addFirst(addName);
}

String get(int index) {

    return internalList.get(index).toString();

}


public static void main(String[] args) {

    SingleList nameList = new SingleList();

    name name1 = new name("John", "Smith");
    nameList.add(name1);

    String getter = nameList.get(0);  
    System.out.println("LinkedList contains : " + nameList.get(0));

}
}

【问题讨论】:

  • 你想让你的“singleList”从java.util.LinkedList继承吗?然后你需要说“扩展”。另外:好的做法是将您的类命名为“SingleList”(您为该类创建的实例可以命名为“singleList”)。
  • Extends 有效,但随后它允许直接访问任何linkedList 实现,我不希望这样。例如,我不希望能够使用 addLast 添加到列表的后面。我将把我的 singleList 的命名修改为 SingleList。谢谢。

标签: java class collections constructor linked-list


【解决方案1】:

您发布的代码的问题是您没有将LinkedList 分配给任何东西,然后addFirst() 方法被编写为好像它是singleList 类的静态方法,它不存在.我相信你试图做的是:

import java.util.LinkedList;

public class SingleList<T>
{
    private LinkedList<T> internal;

    SingleList()
    {
        this.internal = new LinkedList<>();
    }

    public void add(T addName)
    {
        this.internal.addFirst(addName);
    }

    @Override
    public String toString()
    {
        if(!this.internal.isEmpty())
        {
            return this.internal.get(0).toString();
        }
        else
        {
            return this.internal.toString();
        }
    }

    public static void main(String[] args)
    {
        SingleList<name> nameList = new SingleList<>();
        name name1 = new name("John", "Smith");
        nameList.add(name1);
        System.out.println("LinkedList contains : " + nameList);
    }
}

这也有泛型的好处,这意味着它可以使用LinkedList 可以使用的任何类型。此外,我冒昧地更改了类名的大小写,因为 Java 标准是对类名使用正确的大小写,而对变量使用生硬的大小写。

【讨论】:

  • 在阅读了下面的另一个答案后,我拿了一些代码并修改了我的原始代码。它看起来与您在此处发布的内容相似,并且到目前为止似乎没有任何问题。尽管我没有在其中使用我认为不需要的泛型,但我确实看到了这将是一个好处。我会在这里的某个地方发布我的新代码,但不确定它会出现在哪里。
【解决方案2】:

你的类应该实现 List 接口并将其方法重定向到链表:

public class singleList implements List {
    private LinkedList internalList;

    public singleList() {
        internalList = new LinkedList();
    }
    public boolean add(Object e) {
        return internalList.add(e);
    }

    public remove(Object o) {
        throw new RuntimeException("Not implemented.");
    }

    ...
}

对于您想要限制的方法,只需抛出异常。

【讨论】:

  • 必须有一种更简单的方法,然后为我不想访问的每个方法编写异常代码。我非常感谢您的帮助,但我希望有另一种方法。
  • 一个类应该扩展List,除非它打算实现List的所有非可选方法,这里似乎不是这样。
【解决方案3】:

这有意义吗?

没那么多。不过,在你周围进行测试并不需要它。

我得到的第一个错误是它无法从我的 add 方法中找到符号“addFirst”,我也不确定我的 singleList 构造函数是否正确。

您将其命名为 add,而不是 addFirst。
构造函数不行。
方法和构造函数可能如下所示:

public class singleList {
    private LinkedList<name> listName = new LinkedList<>();

    void addFirst(name addName) {
        listName.addFirst(addName);
    }
}

如您所见,不再有构造函数。这是因为java自动添加了一个默认构造函数:

public singleList() {
}

然后,我添加了一个私有类变量,这是你访问列表所需要的。

System.out.println("LinkedList contains : " + nameList);

这不行,你的singlelist和name类必须实现toString,例如:

@Override
public String toString() {
    return listName.toString();
}

(名称类也必须实现toString)


一些进一步的提示:

尝试使用标准的 java 命名约定。就像类的大写名称一样:

import java.util.LinkedList;

class Name {
    private String firstName;
    private String secondName;

    public Name(String firstName, String secondName) {
        this.firstName = firstName;
        this.secondName = secondName;
    }

    @Override
    public String toString() {
        return "Name [firstName=" + firstName + ", secondName=" + secondName + "]";
    }
}

public class SingleList { //should have a better name perhaps

    private LinkedList<Name> listName = new LinkedList<>();

    public SingleList() {
    }

    void addFirst(Name name) {
        listName.addFirst(name);
    }

    @Override
    public String toString() {
        return listName.toString();
    }

    public static void main(String[] args) {
        SingleList listName = new SingleList();

        Name newName = new Name("John", "Smith");
        listName.addFirst(newName);

        System.out.println("LinkedList contains : " + nameList);
    }
}

尝试从这一点继续,我相信你还有更多事情要做。

【讨论】:

    【解决方案4】:

    从哪里开始...

    • 除非您的类是 extends LinkedList 类(或其他一些 List 类)或 implements List 接口,否则它不会是 List

    • 如果你的类不是List,那么它就没有addFirst 方法(除非你定义了一个)。这就是为什么你不能在你的add 方法中调用addFirst 方法!

    • 您的构造函数正在创建一个LinkedList 实例...然后将其丢弃。那是没有意义的。我怀疑你应该把它分配给……某事。 (提示)

    • 语句println("LinkedList contains : " + nameList) 将调用nameList 对象上的toString() 方法将其转换为字符串。由于您创建了一个不扩展现有 List 类的类,因此您需要覆盖 Object 提供的 toString ...'cos that 版本不会显示您列表的内容!

    您可以在这里使用两种方法。您可以创建一个覆盖父 (List) 类行为的类,或者您可以创建一个“包装器”类,其中包含一个真正的 List 类。你什么都不做。

    包装类可能会更简单地解决您的即时需求...假设您不需要真正的List 类。另一种方法将要求您覆盖 every 您想要阻止的方法以使其抛出异常(通常是UnsupportedOperationException ...),为LinkedList API 中的所有操作执行此操作很乏味。

    最后,当我引起您的注意时,Java 类名应该始终以大写字母开头。

    【讨论】:

    • 我正在尝试发布我修改后的代码,但它只是显示为所有文本。不知道如何正确发布。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2012-05-29
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多