Обрезать список до заданного количества элементов


120

Какой метод обрезает список - например, до первых 100 элементов - отбрасывая остальные (без повторения отдельных элементов)?

Ответы:


141

Использование List.subList:

import java.util.*;
import static java.lang.Math.min;

public class T {
  public static void main( String args[] ) {
    List<String> items = Arrays.asList("1");
    List<String> subItems = items.subList(0, min(items.size(), 2));

    // Output: [1]
    System.out.println( subItems );

    items = Arrays.asList("1", "2", "3");
    subItems = items.subList(0, min(items.size(), 2));

    // Output: [1, 2]
    System.out.println( subItems );
  }
}

Вы должны иметь в виду, что subListвозвращает представление элементов, поэтому, если вы хотите, чтобы остальная часть списка имела право на сборку мусора, вы должны скопировать элементы, которые хотите, в новый List:

List<String> subItems = new ArrayList<String>(items.subList(0, 2));

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

Наконец, обратите внимание, что второй аргумент должен быть на единицу больше, чем последний желаемый индекс.


1
хотя вопрос не совсем ясен, похоже, что Сэм хочет удалить конец списка. Поэтому ваш ответ должен включать list.clear ().
— М.П.

Это вряд ли будет работать так же хорошо, как решение karim79, которое является лучшей альтернативой - оно имеет лучшие шансы на хорошую работу и также является самым чистым кодом.
— Лоуренс Дол

Я думаю, это зависит от количества элементов, которые нужно удалить (а также от того, поддерживает ли список модификацию)
— Бен Лингс,

1
Если Java 8 - вариант, я думаю, это Stream.limitдолжно помочь ( docs.oracle.com/javase/8/docs/api/java/util/stream/… )
— Эран Медан

53
list.subList(100, list.size()).clear();

или:

list.subList(0, 100);

3
Первый вариант изменяет список, а второй - нет. Это должно бытьlist = list.subList(0, 100)
— nessa.gp

3
Также обратите внимание, что subList(100, list.size()).clear()будет работать только в том случае, если в списке реализован его метод clear, например, если вы создаете с listпомощью List<String> list = Arrays.asList(someString.split(","));clear (), будет throw, UnsupportedOperationExceptionпоскольку listбудет абстрактным List.
— Гюри

Если вы хотите сохранить начальные n элементов списка, то это должно бытьlist.subList(n, list.size()).clear();
— Чакладер Асфак Арефе

1
Жаль, что вам нужно создать объект только для того, чтобы сократить список
— Дэвид Брэдли,

1
@DavidBradley Верно, но HotSpot может на самом деле оптимизировать это,
— Стефан Райх

8

subList, как предлагается в других ответах, первое, что приходит на ум. Я бы также предложил поточный подход .

source.stream().limit(10).collect(Collectors.toList()); // truncate to first 10 elements
source.stream().skip(2).limit(5).collect(Collectors.toList()); // discards the first 2 elements and takes the next 5
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.