2016-05-16 9 views
-4

Я бы подумал, что на этот вопрос уже был дан ответ, но, похоже, он ничего не может найти.Почему ArrayList.subList (0, n) возвращает список размера n?

Мой вопрос в том, что название говорит, почему создается подсписчик из индекса для индексации, а не возвращает общее число индексов, которые я ожидал бы?

Более подробный пример:

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

Я ожидаю, что журнал для возврата 29 в приведенном выше примере, но на самом деле она возвращает 28.

Почему это происходит и что является правильным решение этого? Чтобы добавить +1 ко второму индексу, или -1 к первому индексу?

ответ

1

Это ясно написано в documentation что Подсписок:

общественности Список Подсписок (интермедиат fromIndex, INT toIndex)

Возвращает представление части этого списка между указанными fromIndex, включительно, и toIndex, эксклюзивный.

Чтобы ответить на ваш вопрос, насколько я понимаю, вы можете захотеть добавить +1 ко второму параметру, так как он не входит в подсписке.

+0

Казалось бы, я тогда был немым. Я проверил документацию много раз и пропустил слово «эксклюзивный», кажется ... Спасибо. – nineteeneightyeight

+0

@nineteeneightyeight Если вы проверили документацию, я бы порекомендовал поставить вопрос в качестве исследования, которое вы сделали. Во-первых, при написании своих исследований вы, скорее всего, заметили эту заметку в документации. Во-вторых, если это происходит, как если бы вы проводили исследование, прежде чем публиковать свой вопрос, он будет менее вероятен. – Ironcache

0

Первый индекс является включительно, другой является эксклюзивным. a.subList (0, п) возвращает список, содержащий элементы 0,1,2, ..., п-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 включительно и toIndex, исключительный. (Если
fromIndex и toIndex равны, возвращается список .) Возвращенный список поддерживается этим списком, поэтому неструктурные изменения в возвращенном списке отражаются в этом списке и наоборот.Возвращаемый список поддерживает все дополнительные список операций, поддерживаемых этого список

1

Doc:

Подсписок (интермедиат fromIndex, внутр toIndex) Возвращает представление части этого списка между указанным fromIndex, включительно, и toIndex, исключая.

общего пользования случай за то, что вы просите за это:

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

Учитывая Javadoc довольно ясно по этому вопросу, извлеченный Подсписок является в том числе fromIndex и исключая toIndex в List.subList (fromIndex , toIndex)

Поэтому subList (0,1) возвращает список только одного элемента: первый.

Sublist javadoc