在Java中遍历链表

在Java中遍历链表,java,linked-list,Java,Linked List,比方说,我对LinkedList列表1中的一个对象有两个引用: LinkedList<Object> List1 = new LinkedList<Object>(); Object first; Object last; 因为我在比较两个物体,它们通常指向不同的位置。此外,我也不能通过引用的值来比较引用,因为列表中可能有一个值多次出现。 那么我如何遍历列表1的这个子列表呢?您可以使用 list1.sublist(list1.indexOf(first), list1.

比方说,我对LinkedList列表1中的一个对象有两个引用:

LinkedList<Object> List1 = new LinkedList<Object>();
Object first;
Object last;
因为我在比较两个物体,它们通常指向不同的位置。此外,我也不能通过引用的值来比较引用,因为列表中可能有一个值多次出现。
那么我如何遍历列表1的这个子列表呢?

您可以使用

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

如果您既不能依赖==也不能依赖.equals,我看不出您怎么可能定义子列表…

不,您当前的比较!=最后一个很好。在Java中,对象位于堆上,您只能使用引用。使用==比较两个引用时,如果它们引用相同的对象,则返回true,这似乎正是您想要的。

您应该使用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的答案,一种方法不是直接添加对象,而是创建一个包装器,这样您就可以

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

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

好的,但是因为第一个和最后一个对象实际上是没有基元类型的对象,所以list1.IndexOfffirst应该返回我在其他方法中分配给它的第一个对象。它肯定会返回正确的第一个对象吗?问题是,indexOfsomeobject返回列表1中某个对象的第一次出现。然而,在我的例子中,可能有几个对象具有相同的值。由于我是Java新手,我的问题是:Java是否将具有相同值的对象视为不同的对象?啊,更新了我的答案。s==首先将根据引用比较对象。感谢您的详细回答,但我认为我的主要问题是由Michael Borgwandt回答的。然而,我将使用sublist方法,JavaDoc明确地说indexOf返回最低的索引I,这样o==null?geti==null:o.equalsgeti,因此它通过值比较对象,前提是正确实现了equals。所以,这里有两个选项。我的意思是,我真正想要的是一个指针,如C++中的第一个指针和最后一个指针。这些指针应该保持不变,并且仍然指向我首先分配给它们的元素。好的,如果我执行类似last=List1.get2的操作,然后将last与某个迭代器进行比较,比如while current!=最后,比较应该比较我真正想比较的两个对象?我想有一件事我没有意识到:如果你做像对象a=b这样的事情;那么a将保留对对象b的引用,对吗?既然a引用了b,我就可以做一些像whilea!=现在的起初,我认为a=b会将对象或b的值分配给a。但是,如果b是基元,则该值仅指定给a。如果b是一个对象,那么a将只保存b的引用。谢谢你的回答,我想我现在明白了。@ptikobj:这个物体实际上没有名字。a和b都不是对象。相反,两者都持有对对象的引用,因此与==相比具有相同的值。另一个问题:通常,LinkedList不包含具有相同引用的对象,对吗?除非我显式地向列表中添加了具有相同引用的项。如果它不包含具有相同引用的对象,那么我可以安全地使用indexOf,正如aioobe所建议的那样。@ptikobj:只有当对象不重写java.lang.Object的equals方法时,因为indexOf才使用它。
 List<WrapperObject<Object>> aList = new LinkedList<WrapperObject<Object>>();