2

[解決済み]

私は(願わくば)次の仕事のためにJavaを学んでいるC++の人です。そのため、私は自分でJavaでリンクリストを実装する練習をしています。標準の二重リンクリストの実装を終了しましたが、うまく機能しています。しかし、その後、順序付きリンクリストを作成しようとしましたが、「<」演算子をオーバーロードできないことが深刻な問題になることに気付きました。

このサイトで他の人の質問を調べましたが、まだうまくいきません。そのため、コードを投稿して、自分のしていることに合わせた回答を得ると思いました。

以降..

リンクリストクラス:

public class MyList<T>  {

/*** ~Public Interface~ ***/
       //insert, delete, size, print, etc.
       ...

    /*** Private Data Members ***/
       //node begin, end, T data
   ....


/** Private node class **/
//Represents the nodes in the list
private class node implements Comparable<T>{ //Don't know if this is right
    node next;
    node prev;
    T    data;

    node(node p, node n, T d){
        next = n;
        prev = p;
        data = d;
    }

    @Override
    public int compareTo(T o) {
        return (data <= o ? 1 : 0); //Get an error still here
    }

          /** Iterator **/
               //iterator class
}

順序付きリンクリストクラス:

public class OrderedList<T> extends MyList<T> implements Comparable<T>{ //Pretty sure this is wrong

public void insert(T d){
    if(empty()){
        push_front(d);
    } else {
        MyList<T>.MyListIter it = begin();
        int i = 0;
             //This won't work obviously
        for(; i < size() || it.current().compareTo(it.next()) == -1; ++i, it.next()){
                    //find node to place the new node before it 
                        it.prev() //Need to go back one since we went forward in the loopcheck.


        }
    }
}

ここで本当に途方に暮れています。この順序付きリストの実装を完了するために、演算子のオーバーロードに似たものをどのように実現しますか?

また、Javaの継承についても把握しようとしているので、その点で何かおかしいと思ったら、遠慮なくチャイムを鳴らしてください。

皆さんありがとう。

アップデート:

さて、私は自分がしなければならないと思った変更を加えましたが、それでもエラーが発生しています。新しいコードは次のとおりです。

MyListクラス内のノードクラス:

private static class node<T> implements Comparable<T>{
    node<T> next;
    node<T> prev;
    T    data;

    node(node<T> p, node<T> n, T d){
        next = n;
        prev = p;
        data = d;
    }

    public int compareTo(T o) {
        return ((Comparable<T>) this.data).compareTo(o);
    }

}

注文リスト:

public class OrderedList> extends MyList {

compareToの使用法:

if(((Comparable<T>) it).compareTo(it.next()) == -1) found = true;

コンパイラーは私にそれらのキャストを強制しました、そして今エラーは次のとおりです:

MyList$MyListIter cannot be cast to java.lang.Comparable

リストイテレータクラスは次のようになります。

public class MyListIter{

そしてそれはMyListの中にあります。

編集[解決済み]

it.current()を実行して実際のデータにアクセスする代わりに、イテレータを使用していたときは、it.compareTo(..)を実行していましたが、もちろん、イテレータはデータではないため、何も知りません。 compareTo()。

4

2 に答える 2

2

これは演習としては良いことですが、a)組み込みのLinkedListに独自のLinkedListを使用することを好む人を雇うことはありません。これの.. ;)

LinkedList、ArrayList、TreeSetのソースを読んで、これらがJDKでどのように実装されているかを理解することをお勧めします。java.lang.また、およびのすべてのクラスとインターフェイスのソースを読むことをお勧めします。java.util.

ノードを他のノードと比較できるようにしたいので、データ型も比較できるようにする必要があります。また、Javaコード規則を使用する必要があります。

public class MyList<T extends Comparable<T>> {

static class Node {
    Node prev, next;
    T    data;

    Node(Node p, Node n, T d){
        next = n;
        prev = p;
        data = d;
    }
}

public void insert(T d){
    if(empty()){
        push_front(d);
        return;
    }
    for (Node<T> node = first;node.next != null; node = node.next) {
       // if less than we need to insert before.
       if (d.compareTo(node.data) < 0) {
          if (node == first) {
              first = new Node(null, first, d);
              node.prev = first;
          } else {
              node = new Node(node.prev, node, d);
              node.prev.next = node;
          }
          return;
       }
于 2012-08-10T16:11:52.470 に答える
1

あなたが述べたように、Javaでは演算子をオーバーロードすることはできません。これは、ソートされたリストが<=を使用してあらゆる種類のオブジェクトを比較することはできないことを意味します。むしろ、データオブジェクトに依存してcompareTo()メソッドを作成したり、リストのユーザーがオブジェクトを提供する方法を提供したりする必要がありComparatorます。リストを最初のケースに厳密に制限したい場合は、次のように宣言できます。

public class OrderedList<T implements Comparable<T>> extends MyList<T>

これにより、リストに挿入されたオブジェクトにcompareTo()メソッドがあることが保証されます。Node.compareTo()これで、関数はこのメソッドとの比較を単純に委任します。

public int compareTo(T o) {  
    return this.data.compareTo(o.data);
}

カスタムを許可Comparatorすると、少し注意が必要になる場合があります。デフォルトの比較が機能するようになった後は、そのままにしておくことをお勧めします。

psリストを相互に比較できるようにしたいですか?もしそうなら、OrderedList実装Comparableすることは理にかなっています。ただし、リストクラスで基本的な操作を行った後は、これを後の演習のために残しておくことをお勧めします。

于 2012-08-10T16:26:49.953 に答える