0

我想做一些简单的事情,即创建我自己的基于 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));

}
}
4

4 回答 4

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.");
    }

    ...
}

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

于 2013-02-03T02:50:58.507 回答
2

您发布的代码的问题是您没有将 分配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 标准是对类名使用正确的大小写,而对变量使用生硬的大小写。

于 2013-02-03T02:58:17.540 回答
1

这有意义吗?

没有那么多。但是,在您周围进行测试并不需要它。

我得到的第一个错误是它无法从我的 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);

这将不起作用,您的单列表和名称类必须实现 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);
    }
}

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

于 2013-02-03T03:01:39.467 回答
0

从哪儿开始 ...

  • 除非您的类是extendsLinkedList(或其他List类)或接口,否则它不会implements是.ListList

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

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

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

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

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

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

于 2013-02-03T02:58:20.053 回答