Есть ли простой способ удалить один и тот же объект из 2 связанных списков? - PullRequest
2 голосов
/ 02 ноября 2010

У меня есть 2 связанных списка.

У меня один и тот же объект в обоих этих списках.Под тем же объектом я имею в виду, что объект имеет то же состояние, но на него ссылается другой указатель объекта.

Я могу вызвать .remove(object); из первого списка, чтобы удалить его, но если я сделаю то же самое длявторой список не удаляется (так как ссылка на указатель объекта отличается)

Есть ли простой способ удалить объекты с одинаковым состоянием из разных списков?

Подумав об этом, я, наверное,перебрать второй список, сравнивая состояние его объектов, но я искал более чистый способ

Ответы [ 3 ]

3 голосов
/ 02 ноября 2010

Переопределить метод equals для объекта. Если они имеют одинаковую функциональность эквивалентности, их следует правильно удалить из обоих списков.

Правка - ради правильности:

Вы должны всегда переопределять метод hashCode при переопределении метода equals. Невыполнение этого требования может не показать каких-либо странных функций в вашем Списке, но как только вы попытаетесь использовать тот же объект, например, в HashMap, вы можете обнаружить, что удаление или вставка могут работать не так, как вы хотели.

0 голосов
/ 02 ноября 2010

Вы должны переопределить как equals(), так и hashCode() на вашем объекте. Когда они не переопределяются, поведение по умолчанию заключается в сравнении идентификатора объекта, то есть ссылки. Когда вы переопределяете Equals, вы можете изменить сравнение, чтобы оно основывалось на состоянии объекта, то есть на логическом равенстве. Важно также помнить, что нужно переопределить hashCode, так как если этого не сделать, это может привести к странному поведению, когда ваш объект используется в HashSet или HashTable.

0 голосов
/ 02 ноября 2010

Если объекты имеют одно и то же состояние, то, вероятно, для вас будет правильным переопределить их методы equals и hashCode, чтобы отразить это.Если объекты совпадают с точки зрения метода equals, вы можете вызвать remove в обоих списках.

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

... удаляет элемент с наименьшим индексом i таким, что (o == null? Get (i) ==null: o.equals (get (i))) (если такой элемент существует) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...