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


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.