我想做一些简单的事情,即创建我自己的基于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));
}
}
答案 0 :(得分: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.");
}
...
}
对于您想要限制的方法,只需抛出异常。
答案 1 :(得分: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标准是在类名上使用适当的情况,并在变量上生成案例。
答案 2 :(得分: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);
}
}
从这一点开始尝试继续,我相信你还有更多工作要做。
答案 3 :(得分:0)
从哪里开始...
除非您的课程为extends
LinkedList
课程(或其他List
课程)或implements
List
界面,否则会获胜t是List
。
如果您的课程不是List
,那么它将没有addFirst
方法(除非您定义了一个)。这就是您无法在addFirst
方法中调用add
方法的原因!
您的构造函数正在创建一个LinkedList
实例......然后将其丢弃。这毫无意义。我怀疑你应该把它分配给......某事。 (提示)
语句println("LinkedList contains : " + nameList)
将调用toString()
对象上的nameList
方法将其转换为字符串。由于您创建了一个不扩展现有List
课程的课程,因此您需要覆盖toString
... {cos 提供的Object
版本不会显示列表中的内容!
您可以在这里使用两种方法。您可以创建一个覆盖父(List
)类行为的类,或者您可以创建一个在其中包含真正List
类的“包装器”类。你们两个都没做。
包装类可能会更简单地解决您的直接需求... 假设您不需要真正的List
类。另一种方法要求您覆盖要阻止的每个方法,以使其为{{1中的所有操作执行此异常操作(通常为UnsupportedOperationException
...) API会很乏味。
最后,当我引起你的注意时,Java类名称应该始终以大写字母开头。