0

一直在寻找解决我的问题的方法。已经阅读了很多关于覆盖等于以正确比较链表的节点但已经卡住的内容。基本上我正在尝试搜索我的列表并找到一个等于它的节点并将其删除。我找到了查看链接列表的方法,但是当我返回节点时,它只是胡言乱语。我正在尝试找到一种将其放入字符串并将其与另一个字符串进行比较的方法。无论如何,这里是当前不起作用的代码和我的 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 进行比较。您应该将杂志与杂志进行比较。

替换if (current.equals(mag))if (current.magazine.equals(mag))

于 2012-12-01T19:09:29.870 回答
1

好的 - 请注意,您的 equals 方法只是重新实现 == identity equals。

这意味着如果other不是同一个杂志对象,这将失败。如果这是你想要的,那很好,但通常你想在杂志中选择属性。

因此,如果 Magazine 有一个String title, 在您的 equals 方法中,您将执行以下操作:

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

另请参阅 Joshua Bloch 的 Effective Java 以获得对此的详细描述。任何时候重写 equals 方法时,都希望重写 hashCode 方法。他们一起去,他描述了原因。

希望这可以帮助。

于 2012-12-01T19:17:14.023 回答
1

如果您使用的是 eclipse,请使用此函数:Eclipse -> Source -> Generate hashCode() 和 equals()。并研究其实施。这将帮助您了解如何编写 equals() 和 hashCode()。祝你好运。

于 2012-12-01T21:55:27.497 回答