Использование логического удаления (Object o) в связанном списке

1

Это метод remove()

public boolean removeId(Object d) {
    boolean removed=false;
    curr=fNode; 

    if(curr==null)
      throw new RuntimeException("cannot delete");

    else if(curr.data==d) {       

        fNode=fNode.next;
        curr=fNode;
        removed=true;
      }

    else  
      curr=curr.next;


    count--;
    return removed;
}

Класс

public class Hospital {

    private int id;
    private String name;
    private double price;
    private String treatType;
    private String date;

    public Hospital()  {
        id=0;
        name="NA";
        price=0;
        treatType="NA";
        date="NA";    
    }

    public Hospital(int a,String b,double c,String d,String e) {
        id=a;
        name=b;
        price=c;
        treatType=d;
        date=e;
    }

    public void setHospital(int a,String b,double c,String d,String e) {
        id=a;
        name=b;
        price=c;
        treatType=d;
        date=e;
    }

    public int getId(){ return id; }
    public String getName(){ return name; }
    public double getPrice(){ return price; }
    public String getTreatType(){ return treatType; }
    public String getDate(){ return date; }

    public String toString()  {
        return ("Id :"+id+"\nName :"+name+"\nPrice :"+price+"\nTreatment type :"+treatType+"\nDate :"+date);
    }
  }

В основном

System.out.println("Enter id you want to remove :");
int remId=in.nextInt();

list.removeId(new Integer(remId));

Почему не удаляется идентификатор в первом узле? Я попробовал удалить первый узел, но он не удаляет его. Я пробовал много способов, в том числе изменить remid на int, но он по-прежнему не работает.

Теперь я делаю некоторые изменения метода remove(), устраняя "while" и использую "equal", но это не имеет никакого смысла. Затем я попробовал другое изменение, и он работает. Почему этот код работает?

public boolean removeId(Object d)
{
    boolean removed=false;

    curr=fNode;
        if(curr==null)
            throw new RuntimeException("cannot delete");

        else
            {
                    fNode=fNode.next;
                    curr=fNode;
                    removed=true;
            }


            curr=curr.next;

    count--;
    return removed;
}
  • 0
    вероятно, потому что вы используете сравнения ссылок == . Попробуйте использовать if(curr.data.equals(d))
  • 0
    Можете ли вы дать определение curr ?
Показать ещё 2 комментария
Теги:

5 ответов

3
Лучший ответ

Причина в том, что вы сравниваете объекты Integer с ==. Вместо этого используйте метод equals().

Когда вы сравниваете объекты в Java с помощью ==, вы сравниваете их для идентификации, а не для равенства. == будет выдаваться true тогда и только тогда, когда оба его операнда являются тем же самым идентичным объектом. Это приведет к false в любом другом случае, который включает случай, когда два операнда равны, но не одинаковы.

Ваш код использует Integer, который является классом, и поэтому вы можете создать два объекта Integer которые являются равными, но не одинаковыми:

public static void equalsVsSameIntegerDemo() {
    final Integer i1 = new Integer(1);
    final Integer i2 = new Integer(1);
    System.out.println(i1.equals(i2)); // true
    System.out.println(i1 == i2); // false
}

Кроме того, если вы знаете, что Integer и не может быть null, вы можете использовать int вместо Integer. Но это работает, только если вы используете int в remove -method. Если вы используете int в вызывающем абоненте и вызываете remove(Object), int будет преобразован в Integer. Если ваши идентификаторы должны быть довольно универсальными, вы хотите перейти на equals() вместо ==.

1

Вы должны сравнить данные узла с equals, а не с ==, который просто проверяет, являются ли эти два экземпляра одинаковыми:

if(curr.data.equals(d))
1

В вашем коде у вас есть if (curr.data==d)

Но вы уверены, что new Integer(remId) == theObjectInsertedInTheList?

Я так не думаю, и здесь твоя проблема.

Дополнительная информация: Equality Equality

1

Вы используете идентификатор объекта для проверки равенства:

if (curr.data == d)

что верно только в том случае, если два операнда являются одним и тем же объектом, а это не так. Измените эту строку на:

if (curr.data.equals(d))

который сравнивает значения двух объектов (по крайней мере, для класса Integer).

0

Обратите внимание, что ваш алгоритм все равно будет терпеть неудачу даже после правильного сравнения, потому что ваш fNode и curr не перемещаются вместе.

При удалении вы удаляете данную ссылку из цепочки - пусть говорят, что цепочка состоит из следующих ссылок: A --> B --> C --> D Удаление C означает удаление ссылки, которая указывает на B --> C и заменяет ее ссылкой, которая указывает на B --> D Итак, вы переходите от A --> B --> C --> D к A --> B --> D

Алгоритм в псевдокоде будет.

 1. start at the beginning of the list with the first node (Head of the list).
 2. check if it is the one you want to delete.
 3. if not, go to the next node and repeat step 2 
 4. if so, make the next node of the previous node the next node of this node
 5. remove the reference from this node to the next node

Ещё вопросы

Сообщество Overcoder
Наверх
Меню