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 というリストを作成することです。この時点でできることは、追加メソッドを使用することだけです。このメソッドは、要素を最初の位置に追加する 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

投稿したコードの問題は、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 に答える
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 に答える
1

これは理にかなっていますか?

それほどではありません。しかし、まあ、あなたの周りをテストするためにそれは必要ありません。

最初のエラーは、add メソッドからシンボル「addFirst」が見つからないというもので、singleList のコンストラクタが正しいかどうかもわかりません。

addFirst ではなく、add と名付けました。
コンストラクターが正しくありません。
メソッドとコンストラクターは次のようになります。

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();
}

(name クラスも 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

  • クラスが でない場合List、メソッドはありませんaddFirst(定義した場合を除きます)。addFirstそのため、メソッド内でメソッドを呼び出すことはできませんadd!

  • あなたのコンストラクターはLinkedListインスタンスを作成しています...そしてそれを捨てています。それは無意味です。あなたはそれを...何かに割り当てるべきだと思います。(ヒント)

  • このステートメントは、オブジェクトのメソッドprintln("LinkedList contains : " + nameList)を呼び出して、それを String に変換します。既存のクラスを拡張しないクラスを作成したため、提供されたものをオーバーライドする必要があります... 'そのバージョンではリストの内容が表示されません!toString()nameListListtoStringObject

ここで使用できるアプローチは 2 つあります。親 ( ) クラスの動作をオーバーライドするクラスを作成することも、内部にList実際のクラスを持つ「ラッパー」クラスを作成することもできます。Listあなたはどちらもしていません。

ラッパークラスは、おそらくあなたの差し迫ったニーズをより簡単に解決するでしょう...真のクラスは必要ないと仮定します。もう 1 つの方法では、防止したいすべてのListメソッドをオーバーライドして例外 (通常は...) をスローする必要があり、API のすべての操作に対してそれを行うのは面倒です。UnsupportedOperationExceptionLinkedList

最後に、注意を喚起している間、Java クラス名は常に大文字で始める必要があります。

于 2013-02-03T02:58:20.053 に答える