2010-12-16 4 views
0

Сай, у меня есть две ссылки на объект в LinkedList List1:Итерация Linked List в Java

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

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

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

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

} 

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

ответ

4

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

6

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

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; 
     } 
    } 
} 
+0

ОК, но так как первые и последние действительно являются объектами (без примитивных типов), list1.indexOf (first) должен возвращать «первый» объект, которому я его присвоил (каким-то другим способом). Будет ли он определенно возвращать «правильный» «первый» объект? – ptikobj 2010-12-16 15:24:42

+0

не уверен, что я понимаю ваш комментарий. – aioobe 2010-12-16 15:27:45

+0

вещь есть, indexOf (someobject) возвращает _first_ появление какого-либо объекта в List1. Однако в моем случае может быть несколько объектов с одинаковым значением. Поскольку я новичок в Java, мой вопрос скорее: действительно ли Java обрабатывает те объекты с тем же значением, что и разные объекты? – ptikobj 2010-12-16 15:32:46

0

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

0

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

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

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

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

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