通过Java中的链接列表进行迭代

时间:2010-12-16 15:12:45

标签: java linked-list

说,我有两个对LinkedList List1中的Object的引用:

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

我不想使用这些对象的列表索引来引用它们,因为我的列表长度发生了变化。我认为这不会奏效。 现在我想迭代第一个和最后一个定义的子列表,其中首先定义List1中子列表的开头,最后定义List1中子列表的结尾。

我现在的问题是AFAIK我不能做像

这样的事情
while (current != last){
// do something
current = someiterator.next();

}

因为我正在比较通常指向不同位置的两个对象。此外,我也无法通过它们的值来比较引用,因为列表可能有一个值出现多次。 那么如何遍历List1的子列表?

5 个答案:

答案 0 :(得分: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;
        }
    }
}

答案 1 :(得分:4)

不,您的比较while (current != last)可以正常使用。在Java中,对象存在于堆上,您只能使用引用。使用==比较两个引用会返回true iff它们引用相同的对象,这似乎正是您想要的。

答案 2 :(得分:0)

如果您既不能依赖==也不能依赖.equals(),我看不出您如何定义子列表......

答案 3 :(得分:0)

您应该使用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的答案

答案 4 :(得分:0)

一种方法是不直接添加对象,而是创建包装器,因此您将拥有

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

现在,您可以通过检查包装器而不是包装对象来验证条目的相等性。