Java: Как ссылаться на класс внутри класса, но другого элемента? - PullRequest
0 голосов
/ 13 апреля 2011

Я не уверен, как объяснить это, но в основном я пытаюсь сослаться на Список Классы front , который имеет Элемент A (можно из любого списка).Но происходит то, что, когда он проходит через элементы списка, он сравнивается из двух разных списков и в итоге не совпадает.то есть сравнивает исходный список, который содержит фронт 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;
        }

    }

1 Ответ

1 голос
/ 13 апреля 2011

Итак, несмотря на мой комментарий, я вижу одну вопиющую проблему с этим.Вы не можете использовать операторы равенства в ссылочных типах.То есть все, кроме примитивного типа (double, int и т. Д.).Что происходит, вы сравниваете адрес экземпляра, и если он не является буквально одним и тем же объектом (одним и тем же адресом в памяти), он никогда не вернет trueМожет быть, это то, что вы хотите, но я подозреваю, что нет.Вам необходимо переопределить метод

public boolean equals(Object obj);

и использовать его для сравнения двух экземпляров данного класса.Я прав в своих предположениях?

Редактировать Хорошо, я думаю, что мое первоначальное предположение было верным.Это работает, если они из одного и того же списка, потому что они в конечном итоге являются одинаковыми элементами (хранятся в той же ячейке памяти).Вам нужно использовать equals() или !equals() вместо == и !=.Попробуйте, и посмотрите, решит ли это ваши проблемы.Кроме того, не просто используйте их, вы должны переопределить equals, чтобы фактически сравнить внутренние свойства элементов.

...