0

これを説明する方法についてはよくわかりませんが、基本的には、要素 AのList Classesフロントを参照しようとしています (任意のリストから取得できます)。しかし、リストの Elements を通過するときに、2 つの異なるリストを比較していて、最終的には一致しません。つまり、フロント b を含む元のリストを要素 A を含むリストと比較します。要素 A のフロントを b に設定して、それがどこにあるかを比較できるようにする方法を考えています。

/*front is a dummy element used to keep position.
List is a class i have made under requirements of naming for subject.
i don't want a solution. I only want to know about how to do it.

This is what is an example code of whats causing the problem USED IN DRIVER PROGRAM
DLL.concat(DLL2);
it is basically getting DLL's front and going through the loop when it should be using DLL2's.

DLL and DLL2 are both Lists
***/


    //will return the index of the Element for comparing

    private int checkElement(Element A){

        Element b = front;

            int i = 0;  
            while (b != a && i<size)
            {
                b = b.next;
                i++;
            }

            return i;
        }


//edit: add

//size is the size of the list gets increased everytime a variable is added to the list on top of the dummy element.

//Item is a private class inside the List class. it contains the values: element,next, previous in which element contains an object, next and previous contain the next element in the list and the previous one (its a double linked list) 

// this is what causes the error to turn up in the above method as im using two different lists and joining them.

    public void concat(List L){
        if  (splice(L.first(),L.last(),last())){
            size = size+L.size;
        }
    }

//this is the splice method for cutting out elements and attaching them after t
//just using the check method to assert that a<b and will later use it to assert t not inbetween a and b

public boolean splice(Element a, Element b, Element t){

        if  (checkElement(a) < checkElement(b)){

            Element A = a.previous;
            Element B = b.next;
            A.next = B;
            B.previous = A;

            Element T = t.next;

            b.next = T;
            a.previous = t;
            t.next = a;
            T.previous = b;
        return true;
        }
        else {

        System.out.println("Splicing did not occur due to b<a");        
        return false;
        }

    }
4

1 に答える 1

1

ですから、私のコメントにもかかわらず、これには明白な問題が1つあります。参照型で等式演算子を使用することはできません。つまり、プリミティブ型(double、intなど)以外のものです。何が起こるかというと、インスタンスのアドレスを比較していて、それらが文字通り同じオブジェクト(メモリ内の同じアドレス)でない限り、trueを返すことはありません。多分それはあなたが望むものですが、私はそうではないと思います。メソッドをオーバーライドする必要があります

public boolean equals(Object obj);

これを使用して、特定のクラスの2つのインスタンスを比較します。私は私の仮定で正しいですか?

編集OK、私の最初の推測は正しかったと思います。それらが同じ要素(同じメモリ位置に格納される)になるため、それらが同じリストからのものである場合に機能します。andではなくequals()orを使用する必要があります。それを試して、問題が解決するかどうかを確認してください。また、それらを使用するだけでなく、要素の内部プロパティを実際に比較するためにオーバーライドする必要があります。!equals()==!=equals

于 2011-04-13T01:14:51.330 に答える