Обрізати список заданою кількістю елементів


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, що є найкращою альтернативою - воно має найкращі шанси на хорошу ефективність і є найчистішим кодом.
— Лоуренс Дол

Я думаю, це залежить від кількості елементів, які потрібно видалити (а також, якщо Список підтримує модифікацію)
— Ben Lings,

1
Якщо Java 8 - це варіант, я думаю, Stream.limitслід зробити трюк ( docs.oracle.com/javase/8/docs/api/java/util/stream/… )
— Eran Medan

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()спрацює лише в тому випадку, якщо в списку буде реалізований чіткий метод, наприклад, якщо ви створюєте listкоманду List<String> list = Arrays.asList(someString.split(","));clear (), UnsupportedOperationExceptionоскільки listбуде абстрактним List.
— Гюрі

Якщо ви хочете зберегти початкові n елементів списку, це має бутиlist.subList(n, list.size()).clear();
— Chaklader Asfak Arefe

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.