4 回答

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個(gè)贊
Iterable
沒(méi)有為您提供在給定位置提取元素的方法,這是設(shè)計(jì)使然。集合框架包含更多專(zhuān)門(mén)的類(lèi)來(lái)處理具有O(1)
元素訪(fǎng)問(wèn)的順序集合。這些是各種眾所周知的列表實(shí)現(xiàn),尤其是那些實(shí)現(xiàn)RandomAccess
接口的。
如您所見(jiàn),選擇集合接口會(huì)產(chǎn)生很大的不同,尤其是在涉及O(xxx)
符號(hào)方面。這是多功能性和性能之間的一種權(quán)衡。通用接口為Iterable
您提供了最廣泛的適用輸入集,但您只能獲得RandomAccess
集合的性能。
如果您要使用的所有輸入都是RandomAccess
集合(ArrayList
實(shí)現(xiàn)它),則沒(méi)有理由將它們作為Iterable
. 如果不是這種情況,您可以在運(yùn)行時(shí)檢查此條件并選擇最有效的算法。

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
使用 Iterable 接口,您無(wú)法獲取特定索引處的元素。所有界面允許您遍歷 Iterable 中的所有項(xiàng)目并觀察其中的內(nèi)容,僅此而已。您將不得不手動(dòng)管理當(dāng)前位置(索引/光標(biāo))。一個(gè)簡(jiǎn)單的解決方案如下:
public static <T> T retrieveItemByIndex(Iterable<T> iterable, int index) {
if (iterable == null || index < 0) {
return null;
}
int cursor = 0;
Iterator<T> iterator = iterable.iterator();
while (cursor < index && iterator.hasNext()) {
iterator.next();
cursor++;
}
return cursor == index && iterator.hasNext() ? iterator.next() : null;
}
如果您不希望此輔助方法使用泛型,只需將其更改為僅適用于您的自定義類(lèi)型,如:
public MyType retrieveItemByIndex(Iterable<MyType> iterable, int index) {
if (iterable == null || index < 0) {
return null;
}
int cursor = 0;
Iterator<MyType> iterator = iterable.iterator();
while (cursor < index && iterator.hasNext()) {
iterator.next();
cursor++;
}
return cursor == index && iterator.hasNext() ? iterator.next() : null;
}
另一種方法是使用 Stream API(Java 8 及更高版本)。
首先,您必須從 Iterable 中獲取一個(gè)流,然后跳過(guò)第一個(gè)index元素并找到第一個(gè)。如果索引超出范圍,將返回默認(rèn)值。
int index = N - 2;
MyType defaultValue = null;
StreamSupport.stream(iterable.spliterator(), false)
.skip(index)
.findFirst()
.orElse(defaultValue);

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊
正如 dbl 所提到的,您無(wú)法在 Iterable 對(duì)象的特定索引處獲取元素。如果您打算將 Iterable 對(duì)象轉(zhuǎn)換為列表,則只需花費(fèi)相同的時(shí)間 (O(n)),再加上獲取目標(biāo)元素的 O(1)。如果您真的很關(guān)心您的 O(n) 時(shí)間,我建議您按原樣迭代它直到您的目標(biāo)元素 (O(n-1))。

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個(gè)贊
如果您只想要倒數(shù)第二個(gè)位置,為什么不在進(jìn)入循環(huán)之前用列表索引那個(gè)位置呢?而不是 list.getItems(),嘗試 list.getItem(list.getItemCount()-2)
添加回答
舉報(bào)