목록을 주어진 요소 수로 자릅니다.


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
질문이 명확하지 않지만 sam이 목록의 끝을 삭제하기를 원하는 것처럼 들립니다. 따라서 답변에 list.clear ()가 포함되어야합니다.
mP.

이것은 최고의 대안 인 karim79의 솔루션만큼 잘 수행되지 않을 것입니다. 잘 수행 될 가능성이 가장 높고 가장 깨끗한 코드이기도합니다.
Lawrence Dol

제거 할 요소의 수에 따라 달라진다고 생각합니다 (또한 목록이 수정을 지원하는 경우)
Ben Lings

1
자바 (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
첫 번째 옵션은 목록을 수정하고 두 번째 옵션은 수정하지 않습니다. 그것은 shoud belist = list.subList(0, 100)
nessa.gp

3
또한 참고 subList(100, list.size()).clear()당신이 만드는 경우 목록에 예를 들어, 그것의 명확한 방법은 구현이있는 경우 것입니다에만 작업을 list하여 List<String> list = Arrays.asList(someString.split(","));(일반 던질 것) UnsupportedOperationException때문에 list추상적 인 것입니다 List.
Gyuri

목록의 초기 n 개 요소를 유지하려면 다음과 같아야합니다list.subList(n, list.size()).clear();
Chaklader Asfak Arefe

1
목록을 줄이려면 개체를 만들어야하는 것이 부끄러운
David Bradley

1
@DavidBradley 진정한하지만 핫스팟 실제로이 최적화 할 수 있습니다
스테판 제국

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.