Cắt ngắn danh sách thành một số phần tử nhất định


120

Phương pháp nào cắt bớt một danh sách - ví dụ như 100 phần tử đầu tiên - loại bỏ những phần tử khác (mà không lặp lại qua các phần tử riêng lẻ)?

Câu trả lời:


141

Sử dụng 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 );
  }
}

Bạn nên nhớ rằng subListtrả về một chế độ xem của các mục, vì vậy nếu bạn muốn phần còn lại của danh sách đủ điều kiện để thu gom rác, bạn nên sao chép các mục bạn muốn sang một mục mới List:

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

Nếu danh sách ngắn hơn kích thước được chỉ định, hãy mong đợi một ngoại lệ ngoài giới hạn . Chọn giá trị tối thiểu của kích thước mong muốn và kích thước hiện tại của danh sách làm chỉ mục kết thúc.

Cuối cùng, lưu ý rằng đối số thứ hai phải nhiều hơn một chỉ số mong muốn cuối cùng.


1
trong khi câu hỏi không chính xác rõ ràng, nó giống như sam muốn một phần cuối của danh sách bị xóa. Do đó, câu trả lời của bạn nên bao gồm một list.clear ().
mP.

Điều này không có khả năng hoạt động tốt như giải pháp của karim79, đây là giải pháp thay thế tốt nhất - nó có cơ hội hoạt động tốt nhất và cũng là mã sạch nhất.
Lawrence Dol,

Tôi nghĩ rằng nó phụ thuộc vào số lượng các yếu tố phải được loại bỏ (và cũng có thể nếu danh sách hỗ trợ sửa đổi)
Bến Zerglings

1
Nếu Java 8 là một lựa chọn, tôi nghĩ Stream.limitnên làm các trick ( docs.oracle.com/javase/8/docs/api/java/util/stream/... )
Eran Medan

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

hoặc là:

list.subList(0, 100);

3
Tùy chọn đầu tiên sửa đổi danh sách trong khi tùy chọn thứ hai thì không. Thật tuyệt vờilist = list.subList(0, 100)
nessa.gp

3
Cũng lưu ý rằng subList(100, list.size()).clear()sẽ chỉ hoạt động nếu danh sách có phương thức rõ ràng của nó được triển khai, ví dụ: nếu bạn tạo listbằng List<String> list = Arrays.asList(someString.split(","));clear () sẽ ném UnsupportedOperationExceptionlistnó sẽ là một trừu tượng List.
Gyuri

Nếu bạn muốn giữ các yếu tố n ban đầu của danh sách, nó phải làlist.subList(n, list.size()).clear();
Chaklader Asfak Arefe

1
Xấu hổ bạn phải tạo một đối tượng chỉ để rút ngắn danh sách
David Bradley

1
@DavidBradley Đúng nhưng HotSpot có thể thực sự tối ưu hóa đi này
Stefan Reich

8

subList, như được gợi ý trong các câu trả lời khác, là câu trả lời đầu tiên xuất hiện trong đầu. Tôi cũng sẽ đề xuất một cách tiếp cận luồng .

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.