0

私の問題の解決策を探しています。リンクリストのノードを適切に比較するためにequalsをオーバーライドすることについて多くのことを読んでいますが、行き詰まっています。基本的に、私は自分のリストを検索して、それに等しいノードを見つけて削除しようとしています。リンクリストを調べる方法を見つけましたが、ノードを返すと、それはただのぎこちないものです。私はそれを文字列に入れて別の文字列と比較する方法を見つけようとしています。とにかくここにコードと私のequalsメソッドがありますが、現在は機能しません。

public class MagazineList {
    private MagazineNode list;
    private Object obj;

    public MagazineList(){
        list = null;
    }


    public void add(Magazine mag){
        MagazineNode node = new MagazineNode(mag);
        MagazineNode current;

        if(list==null)
            list = node;
        else{
            current = list;
            while(current.next != null)
                current = current.next;
            current.next = node;
        }   
    }
    public void insert(Magazine mag)
    {
        MagazineNode node = new MagazineNode (mag);

        // make the new first node point to the current root
        node.next=list;

        // update the root to the new first node
        list=node;
    }
    public void deleteAll(){
        if(list == null){

        }
        else{
            list = null;
        }
    }

    public void delete (Magazine mag) {
        MagazineNode current = this.list;
        MagazineNode before;

        //if is the first element
        if (current.equals(mag)) {
            this.list = current.next;
            return;     //ending the method
        }


        before = current;

        //while there are elements in the list
        while ((current = current.next) != null) {

            //if is the current element
            if (current.equals(mag)) {
                before.next = current.next;
                return;     //endind the method 
            }

            before = current;
        }

        //it isnt in the list
    }
    public boolean equals(Object other) {

        System.out.println("Here in equals" + other + this);
        // Not strictly necessary, but often a good optimization
        if (this == other)
            return true;
        else{
            return false;
        }
    }

    @ Override
    public String toString(){
        String result = " ";

        MagazineNode current = list;
        while (current != null){
            result += current.magazine + "\n";
            current = current.next;     
        }
        return result;
    }


    private class MagazineNode {
        public Magazine magazine;
        public MagazineNode next;


        public MagazineNode(Magazine mag){
            magazine = mag;
            next = null;
        }
    }
}
4

3 に答える 3

5

MagazineNodeをMagazineと比較するべきではないことを除いて、deleteメソッドは問題ないように見えます。雑誌と雑誌を比較する必要があります。

if (current.equals(mag))に置き換えif (current.magazine.equals(mag))ます。

于 2012-12-01T19:09:29.870 に答える
1

わかりました-equalsメソッドは==identityequalsを再実装しているだけであることに注意してください。

つまりother、が同じMagazineオブジェクトでない場合、これは失敗します。それが必要な場合は問題ありませんが、通常はMagazine内の属性を選択します。

したがって、Magazineにが含まれている場合String title、equalsメソッドでは次のようになります。

if (magazine instanceof Magazine && magazine.getTitle().equals(other.getTitle()) returnval = true;

また、これについての詳細な説明については、JoshuaBlochのEffectiveJavaを参照してください。equalsメソッドをオーバーライドするときはいつでも、hashCodeメソッドもオーバーライドする必要があります。彼らは一緒に行き、彼はその理由を説明します。

お役に立てれば。

于 2012-12-01T19:17:14.023 に答える
1

Eclipseを使用している場合は、次の関数を使用します:Eclipse-> Source-> Generate hashCode()and equals()。そして、その実装を研究します。これは、equals()とhashCode()の記述方法を理解するのに役立ちます。幸運を。

于 2012-12-01T21:55:27.497 に答える