簡體   English   中英

基於java.util.linkedlist創建我自己的受限鏈表

[英]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);
    }
}

從這一點開始嘗試繼續,我相信您還有很多事情要做。

從哪兒開始 ...

  • 除非您的類extendsLinkedList類(或其他一些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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM