2012-10-15 37 views
0

這是Oracle網站上的中indexOf()的示例實現。我在if迴路是如何在這裏工作有點糊塗:有人可以幫助解釋這個indexOf()實現是如何工作的?

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() == nulle == null?當輸入e爲空時,有人能幫助我瞭解它是如何完成的嗎?

+0

如果列表不包含任何空引用,則返回-1。 rembember for循環只運行it.hasNext()。 –

+0

@FlorianMinges列表不包含任何空引用是什麼意思? – nemesis

回答

5

如果it.next() == null僅在e == null這是爲了避免NullPointerException在評估e.equals(it.next())時檢查循環。

如果e != null,則調用常規e.equals()方法。

null是可以插入到LinkedList中的有效「元素」,因此必須將其考慮在內。

未插入最後一個元素的位置。請注意,與鏈接列表中最後一個元素爲null的文本簿數據結構不同,在此處 - 當您到達最後一個元素時,it.hasNext()將被評估爲false,而不會讓您看到此「垃圾」元素。

+0

哦,我不知道一個列表可以有空元素...這很有道理。謝謝! – nemesis

0

如果enull,該indexOf()方法將迭代,直到它找到在你通過迭代的對象另一個null元素並返回其索引。

0

我想你已經誤解了關於ternary operator的事情。

這條線:

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

檢查看到e是空,如果是,那麼它會檢查迭代器的下一個元素是空(這有效地阻止反覆操作,從而以避免NullPointerException),否則:(如果e是非空 - 即它有它的一些值),進行比較:

e.equals(it.next()) 
+1

如果'e'爲'null',則不會將迭代器設置爲'null' - 它將檢查迭代器下一個元素是否爲'null'。 –

+0

謝謝@FlorianMinges,我已經按照你的建議更新了我的答案。 – jrd1

0

if (e == null ? it.next() == null : e.equals(it.next())) - 這是一個Java三元運算符

it.next() == null是空校驗(返回true或false來看看這是最後一個元素) 如果這是真的

return it.previousIndex();執行

如果E不爲空,然後

e.equals(it.next())

執行和如果那是真的,

return it.previousIndex();執行

這是你想要的索引的元素的索引。希望我的解釋不會讓人困惑。

+0

'=='是java中的一個相等運算符,而'='用於將值賦給變量。因此'it.next()== null'是一個檢查,而不是一個賦值。此外,在if循環中有一個賦值(你的代碼不會編譯)是沒有意義的,因爲你需要一個布爾語句。 –

+0

感謝弗洛裏安,我的壞。我編輯了我的答案。 – javarebel

相關問題