Перебирать связанный список в Java - PullRequest
0 голосов
/ 16 декабря 2010

Скажем, у меня есть две ссылки на объект в списке LinkedList1:

LinkedList<Object> List1 = new LinkedList<Object>();
Object first;
Object last;

Я не хочу использовать индекс списка этих объектов для ссылки на них, потому что длина моего списка изменяется. Я думаю, что это не сработает. Теперь я хочу перебрать подсписок, определенный first и last, где first определяет начало подсписка в List1, а last определяет конец подсписка в List1.

Моя проблема сейчас в том, что AFAIK я не могу сделать что-то вроде

while (current != last){
// do something
current = someiterator.next();

}

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

Ответы [ 5 ]

6 голосов
/ 16 декабря 2010

Вы можете использовать что-то вроде

list1.sublist(list1.indexOf(first), list1.indexOf(last))

Хорошо, я думаю, теперь я понимаю ваш вопрос лучше.Вышеуказанный метод будет использовать метод .equals и, следовательно, не будет сравнивать ссылки.Вот, вероятно, лучшее решение для вас:

import java.util.*;

public class Test {

    public static void main(String[] args) {

        String first = "beta";
        String last = "delta";

        List<String> list1 = new LinkedList<String>();
        list1.add("alpha");
        list1.add(first);
        list1.add("gamma");
        list1.add(last);
        list1.add("epsilon");

        boolean firstFound = false;
        for (String s : list1) {

            if (firstFound || (firstFound = s == first))
                System.out.println(s);

            if (s == last)
                break;
        }
    }
}
4 голосов
/ 16 декабря 2010

Нет, ваше сравнение while (current != last) будет работать нормально. В Java объекты живут в куче, а вы работаете только со ссылками. Сравнение двух ссылок с использованием == возвращает true, если они ссылаются на один и тот же объект, что, кажется, является именно тем, что вы хотите.

0 голосов
/ 16 декабря 2010

Один из способов - не добавлять объекты напрямую, а создать оболочку, поэтому у вас будет

 List<WrapperObject<Object>> aList = new LinkedList<WrapperObject<Object>>();

Теперь вы можете проверить равенство записей , проверив упаковщики вместо обернутых объектов.

0 голосов
/ 16 декабря 2010

Вы должны использовать Object.equals () для сравнения ваших объектов.Если ваши объекты являются реальными объектами, а не примитивами или строками (они равны, если их значение равно), вы можете сделать это:

 boolean start = false;
 for(Object o : list){
     if(o.equals(first){
         start = true;
     }else if(o.equals(last)){
        break;
     }
     if(start){
         // do something
     }
 }

Или, скорее, используйте ответ aioobe

0 голосов
/ 16 декабря 2010

Если вы не можете полагаться ни на ==, ни на .equals (), я не понимаю, как вы могли бы определить подсписок ...

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