Удалить по индексу в LinkedList - PullRequest
1 голос
/ 28 февраля 2011

Это не то, что я бы делал в реальной жизни, но говорю:

LinkedList = a,b,c,d,e и я получаю соответствующий им индекс.

Скажите, я хочу удалить b (index=1) and d (index=3) (т.е. значения, окружающие c (index=j=2))

Теперь я делаю (что отлично работает):

When j=2
LS.remove(j + 1); ----> j=3 (d removed)
LS.remove(j - 1); ----> j=1 (b removed)

и b and d удалены.

Но если, я делаю (не работает):

When j=2
LS.remove(j - 1); ----> j=1 (b removed)
LS.remove(j); ----> j=2 (d is not removed) (used j because due to above removal, LL has adjusted it self)

т.е. когда я сначала перемещаю значение, предшествующее 'c', 'd' не удаляется, и LL остается без изменений. Я думаю, я делаю то же самое.

Я что-то упускаю здесь?

UPDATE:

Итак, когда я меняю подпись public void operation(String operator, Integer j) to public void operation(String operator, int j), это сработало.

Ответы [ 3 ]

5 голосов
/ 28 февраля 2011

Если j имеет тип big Integer, то вместо LinkedList.remove(int) будет вызван LinkedList.remove(Object).И это не то, что вы на самом деле хотите.

Я не вижу смысла использовать big-Integer в качестве типа j во втором примере, вы должны использовать примитив int.

Пожалуйста, отметьте Почему методы Java Collections не являются общими для удаления? , почему LinkedList все еще имеет remove(Object) подпись.

2 голосов
/ 28 февраля 2011

Когда вы изменяете список, обращаться к элементам списка по индексу довольно сложно, и поэтому отношение от индекса к элементу меняется. Вот почему в Java java.util.List имеет метод List.listIterator(), который дает java.util.ListIterator. С этим вы могли бы написать метод так:

void removeAdjacent(List<?> list, Object o) {
    ListIterator<?> listIt = list.listIterator();
    while (listIt.hasNext()) {
        if (listIt.next().equals(o)) {
            // set the iterator back to the element we just checked
            listIt.previous();
            // remove previous if it exists
            // and set the iterator again to this element
            if (listIt.hasPrevious()) {
                listIt.previous();
                listIt.remove();
                listIt.next();
            }
            // remove next if it exists
            if (listIt.hasNext()) {
                listIt.next();
                listIt.remove();
            }
        }
    }
}
1 голос
/ 28 февраля 2011

Вы что-то упускаете. Эта полная программа дает ожидаемый результат:

import java.util.LinkedList;
public class Foo {
   public static void main(String []argv) {
      LinkedList<String> l = new LinkedList<String>();
      l.add("a");
      l.add("b");
      l.add("c");
      l.add("d");
      l.add("e");
      int j = 2;
      l.remove(j - 1);
      l.remove(j);
      System.out.println(l.toString());
   }
}

Результат:

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