使用LinkedList访问get方法



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

直接使用directList.get(i)。但是您不应该将基于索引的get()方法与LinkedList一起使用,因为它非常慢。相反,您应该使用迭代器(或每个循环使用一个迭代器,本质上是相同的):

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

在Java 8中,您还可以使用以下解决方案(速度会比较慢,因为它会过滤整个列表):

Direct d = list.stream().filter(direct -> direct.getName().equals(name)).findFirst();

(至少)有两种方法:

// generally easier to read if you don't need access to the iteration number.
for( Direct d : directList )
{
    d.getName();
    // ...
}

或使用List#get(int)方法(虽然这是有效的,因为您使用的是LinkedList,此解决方案是O(n^2)而不是O(n),因此不应该使用)

for( int i = 0; i < directList.size(); ++i )
{
    directList.get(i).getName();
}

相关内容

  • 没有找到相关文章

最新更新