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


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.