2016-05-16 120 views
-4

我原以爲這個問題以前可能會被回答,但似乎無法找到任何有關它的信息。爲什麼ArrayList.subList(0,n)返回大小爲n的列表?

我的問題是正如標題所說,爲什麼創建一個從索引到索引的子列表,而不是返回我期望的索引總數?

更詳細的例子:

List slice = points.sublist(20, 48); 
Log.i(TAG, slice.size()); 

我期望的日誌在上面的例子返回29,但事實上它返回28

爲什麼會出現這種情況,什麼是正確的解決這個問題?向第二個索引添加+1,或者向第一個索引添加-1?

回答

1

可以清楚地寫在子列表中的documentation

公共列表子列表(INT的fromIndex, INT toIndex)

返回指定 的fromIndex之間的這種列表的該部分的視圖,包含性,以及指數,排他性。

要回答你的問題,據我所知,你可能想要+1添加到第二個參數,因爲它不包括在子列表中。

+0

它會出現我是愚蠢的然後。我查了很多次文檔,錯過了「獨家」這個詞,似乎......謝謝。 – nineteeneightyeight

+0

@nineteeneightyeight如果你已經檢查了文檔,我建議把這個問題作爲你所做的研究。首先,在寫出你的研究結果時,你更有可能在文檔中看到這個記錄。其次,如果它像你在發佈你的問題之前進行研究一樣脫落,那麼它就不太可能被低估。 – Ironcache

0

第一個索引是包含性的,另一個是排他性的。 a.subList(0,n)返回包含元素0,1,2,一個列表...,N-1

documentation

0

表示從subList文檔:

/** 
* Returns a {@code List} of the specified portion of this {@code List} from the given start 
* index to the end index minus one. The returned {@code List} is backed by this 
* {@code List} so changes to it are reflected by the other. 
* 
* @param start 
*   the index at which to start the sublist. 
* @param end 
*   the index one past the end of the sublist. 
* @return a list of a portion of this {@code List}. 
* @throws IndexOutOfBoundsException 
*    if {@code start < 0, start > end} or {@code end > 
*    size()} 
*/ 
public List<E> subList(int start, int end); 

正如你所看到的,end參數是「該指數過去一個子列表的一個」。 因此,當你說「停在48」時,它實際上覆制了物品47,然後停下來。

1

我希望在日誌在上面的例子中

不是真的返回29,根據Doc

子列表(INT  的fromIndex, INT   toIndex)

返回指定
fromIndex(包括)元素範圍爲排他性之間此列表的所述部分的視圖。 (如果
fromIndex和toIndex相等,則返回列表 爲空。)返回的列表由此列表支持,因此 返回列表中的非結構更改將反映在此 列表中,反之亦然。返回的列表支持所有由該列表所支持的可選 列表操作的

1

文檔:

子列表(INT的fromIndex,INT toIndex) 返回指定之間的這種列表的該部分的視圖fromIndex,包括,以及索引,獨佔

一般使用情況下你所要求的是:

points.sublist(20, points.size()); 
0

考慮的Javadoc在這一點上,所提取的子列表中包括的fromIndex和排除List.subList的toIndex很清楚(的fromIndex ,toIndex)

因此,subList(0,1)將只返回一個元素的列表:第一個。

Sublist javadoc

相關問題