Java 使用LinkedList访问get方法

Java 使用LinkedList访问get方法,java,collections,linked-list,Java,Collections,Linked List,Direct是一个包含2个get方法的类,其中一个是getName()。 在下面的代码中,我使用的是一个数组,它工作正常 但是如果我想将它存储在LinkedList而不是数组中,那么如何迭代并访问getName()方法呢。如果只是一个常见原语(如字符串)列表,我可以很好地进行迭代,但在这种情况下,如果它是一个类列表,我对如何访问getName()方法感到困惑。谢谢你的帮助 private LinkedList<Direct> directList= new LinkedList();

Direct是一个包含2个get方法的类,其中一个是
getName()
。 在下面的代码中,我使用的是一个数组,它工作正常

但是如果我想将它存储在
LinkedList
而不是数组中,那么如何迭代并访问
getName()
方法呢。如果只是一个常见原语(如字符串)列表,我可以很好地进行迭代,但在这种情况下,如果它是一个类列表,我对如何访问
getName()
方法感到困惑。谢谢你的帮助

private LinkedList<Direct> directList= new LinkedList();
private ListIterator<Direct> iterator = directList.listIterator(); 
private Direct[] direct = new Direct[100];

private int find(String name){
    for (int x=0; x < direct.length; x++){
        if (direct[x] != null)
            if (direct[x].getName().equals(name)){
                return x;
        }
    }
    return -1;
}
private LinkedList directList=new LinkedList();
私有ListIterator迭代器=directList.ListIterator();
私人直销[]直销=新直销[100];
私有整数查找(字符串名称){
对于(int x=0;x
至少有两种方法:

// generally easier to read if you don't need access to the iteration number.
for( Direct d : directList )
{
    d.getName();
    // ...
}
或者使用方法(虽然这是有效的,因为您使用的是
LinkedList
此解决方案是
O(n^2)
而不是
O(n)
它不应该被使用。)

for(int i=0;i
只需使用
directList.get(i)
。但是,您不应该将基于索引的
get()
方法与
LinkedList
结合使用,因为它的速度非常慢。相反,您应该使用迭代器(或for-each循环,本质上是相同的):


您不应该使用(…获取(i)
)的
来迭代
链接列表。对于第二种方法,您应该使用
iterator()
(出于性能原因,因为需要N次迭代才能到达第N个元素),是否有任何特定的原因使您在增量i之前而不是增量后?@user3439075。增量后必须保留增量前的值的临时变量才能返回,而增量前则不能。但无论如何,这可能会被编译掉。正如@xav所说,你不应该在链表中使用
get
,因为它的速度很慢:
O(n)
vs
O(n^2)
明白了,谢谢。正在考虑如何在使用迭代器时仍然获得匹配位置的索引值。@user3439075您可以使用迭代器和迭代索引:
int i=0;对于(directd:list){…;++i;}
我想使用迭代器的方法,但是这样做,我无法获得匹配位置的索引值。啊,那么为什么不简单地引入一个int变量并自己计数呢?这仍然比在链表上使用基于索引的访问要好得多。
for( int i = 0; i < directList.size(); ++i )
{
    directList.get(i).getName();
}
int cnt = 0;
List<Direct> list = new LinkedList<>();
for (Direct d : list) {
    if (name.equals(d.getName())) {
        return cnt;
    }
    cnt++;
}
for (Iterator<Direct> it = list.iterator(); it.hasNext();) {
    Direct d = it.next();
    if(name.equals(d.getName())){
        System.out.println("matches");
    }
}
Direct d = list.stream().filter(direct -> direct.getName().equals(name)).findFirst();