有人可以帮助解释这个indexOf()实现是如何工作的吗?

时间:2012-10-15 23:01:53

标签: java linked-list

这是Oracle网站indexOf()LinkedList的示例实现。关于if循环如何在这里工作,我有点困惑:

public int indexOf(E e) {
    for (ListIterator<E> it = listIterator(); it.hasNext(); )
        if (e == null ? it.next() == null : e.equals(it.next()))
            return it.previousIndex();
    // Element not found
    return -1;
}

所以ListIterator对象是在列表的头部创建的。 for循环继续,直到迭代器到达列表的末尾,if循环检查是否找到目标对象。我不明白的部分是if为什么在it.next() == null时循环检查e == null?当输入e为空时,有人可以帮助我了解它是如何完成的吗?

4 个答案:

答案 0 :(得分:5)

循环检查it.next() == null是否仅e == null这样做是为了避免在评估e.equals(it.next())时出现NullPointerException。

如果e != null,则调用常规e.equals()方法。

null是一个有效的“元素”,可插入LinkedList,因此必须予以考虑。

未插入最后一个元素的位置。请注意,与链接列表中最后一个元素为null的教科书数据结构不同,在此处 - 当您到达最后一个元素时 - it.hasNext()将被评估为false,而不会让您看到此“垃圾”元素。

答案 1 :(得分:0)

如果enull,则indexOf()方法将迭代,直到它在您传递的可迭代对象中找到另一个null元素并返回其索引。

答案 2 :(得分:0)

我认为你误解了ternary operator的问题。

这一行:

if (e == null ? it.next() == null : e.equals(it.next()))

检查 e是否为空,如果是,则检查迭代器的下一个元素是否为空(这有效地停止了迭代操作,以便避免使用NullPointerException),否则:(如果e 不为空 - 即它有一些值),执行比较:

e.equals(it.next())

答案 3 :(得分:0)

if (e == null ? it.next() == null : e.equals(it.next())) - 这是一个java三元运算符

it.next() == null是一个空检查(返回true或false以查看这是否是最后一个元素) 如果那是真的

return it.previousIndex();执行

如果e不为null,那么

e.equals(it.next())

执行,如果那是真的,

return it.previousIndex();执行

这是您想要索引的元素的索引。希望我的解释不会令人困惑。