[英]Create my own limited linkedlist based on java.util.linkedlist
我想做一些簡單的事情,就是創建自己的基於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));
}
}
您的類應實現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.");
}
...
}
對於要限制的方法,只需拋出一個異常。
您發布的代碼的問題在於您沒有將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標准是對類名使用適當的大小寫,對變量使用小寫的大小寫。
這有意義嗎?
沒有那么多。 但是很好,不需要測試。
我得到的第一個錯誤是它無法從我的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);
}
}
從這一點開始嘗試繼續,我相信您還有很多事情要做。
從哪兒開始 ...
除非您的類extends
了LinkedList
類(或其他一些List
類)或implements
List
接口,否則它將不是List
。
如果您的類不是List
,則它將沒有addFirst
方法(除非您定義了一個方法)。 這就是為什么你不能調用addFirst
方法在add
方法!
您的構造函數正在創建一個LinkedList
實例,然后將其丟棄。 那是沒有意義的。 我懷疑您應該將其分配給...某物。 (暗示)
語句println("LinkedList contains : " + nameList)
將在nameList
對象上調用toString()
方法以將其轉換為String。 由於您創建的類不會擴展現有的List
類,因此您需要覆蓋Object
提供的toString
...因為該版本不會顯示列表的內容!
您可以在此處使用兩種方法。 您可能正在創建一個覆蓋父類( List
)類的行為的類,或者正在創建其中包含真實List
類的“包裝器”類。 你什么都不做。
包裝器類可能會更簡單地解決您的緊迫需求…… 假設您不需要真正的List
類。 另一種方法將要求您重寫要防止其引發異常的每個方法(通常是UnsupportedOperationException
...),因為這樣做對LinkedList
API中的所有操作都是乏味的。
最后,在引起您注意的同時,Java類名稱應始終以大寫字母開頭。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.